diff --git a/spring-data-rest-querydsl/pom.xml b/spring-data-rest-querydsl/pom.xml
new file mode 100644
index 0000000000..f9d5d27773
--- /dev/null
+++ b/spring-data-rest-querydsl/pom.xml
@@ -0,0 +1,236 @@
+
+
+ 4.0.0
+
+ com.vivelibre
+ VLCore
+ 2.0.31-SNAPSHOT
+
+
+ VLCore
+ Vivelibre API - Microservices
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.9.RELEASE
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-netflix
+ 1.3.4.RELEASE
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-rest
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ mysql
+ mysql-connector-java
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+
+
+ org.springframework.cloud
+ spring-cloud-starter-ribbon
+
+
+ org.springframework.cloud
+ spring-cloud-starter-hystrix
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.springframework.boot
+ spring-boot-actuator
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+ org.springframework.restdocs
+ spring-restdocs-mockmvc
+ test
+
+
+ org.springframework.data
+ spring-data-rest-hal-browser
+
+
+ org.springframework.boot
+ spring-boot-starter-hateoas
+
+
+ com.querydsl
+ querydsl-apt
+
+
+ com.querydsl
+ querydsl-jpa
+
+
+ org.slf4j
+ slf4j-log4j12
+ 1.6.1
+
+
+ junit
+ junit
+ test
+
+
+ io.rest-assured
+ rest-assured
+ 3.0.6
+ test
+
+
+ javax.ws.rs
+ jsr311-api
+ 1.1.1
+
+
+ com.google.code.gson
+ gson
+ 2.8.2
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+ com.google.guava
+ guava
+ 23.6-jre
+
+
+ net.sf.dozer
+ dozer
+ 5.5.1
+
+
+ org.apache.xmlrpc
+ xmlrpc-client
+ 3.1.3
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ ${start-class}
+ ZIP
+
+
+
+
+ repackage
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+ -verbose
+ -parameters
+
+
+
+
+ com.mysema.maven
+ apt-maven-plugin
+ 1.1.3
+
+
+ generate-sources
+
+ process
+
+
+ ${project.build.directory}/generated-sources
+ com.querydsl.apt.jpa.JPAAnnotationProcessor
+
+
+
+
+
+ maven-release-plugin
+ 2.5.1
+
+
+
+
+
+ scm:git:http://jcollado@192.169.170.109:7990/scm/viv/vivelibre-backendside-core-vlcore.git
+ http://192.169.170.109:7990/projects/VIV/repos/vivelibre-backendside-core-vlcore
+ scm:git:http://jcollado@192.169.170.109:7990/scm/viv/vivelibre-backendside-core-vlcore.git
+
+ VLCore-2.0.28
+
+
+
+
+ releases
+ http://192.169.170.109:3000/nexus/content/repositories/releases
+
+
+
+
+
+ nexus-releases
+ nexus
+ http://192.169.170.109:3000/nexus/content/repositories/releases/
+
+
+
+
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java
new file mode 100644
index 0000000000..db87e920e1
--- /dev/null
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java
@@ -0,0 +1,39 @@
+package com.baeldung;
+
+import com.baeldung.controller.repository.AddressRepository;
+import com.baeldung.controller.repository.PersonRepository;
+import com.baeldung.entity.Address;
+import com.baeldung.entity.Person;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+import javax.annotation.PostConstruct;
+import java.util.UUID;
+
+@SpringBootApplication @EntityScan("com.baeldung.entity") @EnableJpaRepositories("com.baeldung.controller.repository")
+public class Application {
+
+ @Autowired private PersonRepository personRepository;
+ @Autowired private AddressRepository addressRepository;
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ @PostConstruct private void initializeData() {
+ // Create John
+ final Address johnsAddress = new Address(UUID.randomUUID().toString(), "Fake Street 1", "Fake country");
+ addressRepository.save(johnsAddress);
+ final Person john = new Person(UUID.randomUUID().toString(), "John", johnsAddress);
+ personRepository.save(john);
+
+ // Create Lisa
+ final Address lisasAddress = new Address(UUID.randomUUID().toString(), "Real Street 1", "Real country");
+ addressRepository.save(lisasAddress);
+ final Person lisa = new Person(UUID.randomUUID().toString(), "Lisa", lisasAddress);
+ personRepository.save(lisa);
+ }
+}
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/QueryController.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/QueryController.java
new file mode 100644
index 0000000000..753250e638
--- /dev/null
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/QueryController.java
@@ -0,0 +1,22 @@
+package com.baeldung.controller;
+
+import com.baeldung.controller.repository.PersonRepository;
+import com.baeldung.entity.Person;
+import com.querydsl.core.BooleanBuilder;
+import com.querydsl.core.types.Predicate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.querydsl.binding.QuerydslPredicate;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController public class QueryController {
+
+ @Autowired private PersonRepository personRepository;
+
+ @GetMapping(value = "/personQuery", produces = MediaType.APPLICATION_JSON_VALUE)
+ public Iterable getFilteredEvents(@QuerydslPredicate(root = Person.class) Predicate predicate) {
+ final BooleanBuilder builder = new BooleanBuilder();
+ return personRepository.findAll(builder.and(predicate));
+ }
+}
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java
new file mode 100644
index 0000000000..aa42ca6779
--- /dev/null
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java
@@ -0,0 +1,18 @@
+package com.baeldung.controller.repository;
+
+import com.baeldung.entity.Address;
+import com.baeldung.entity.QAddress;
+import com.querydsl.core.types.dsl.StringExpression;
+import com.querydsl.core.types.dsl.StringPath;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QueryDslPredicateExecutor;
+import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer;
+import org.springframework.data.querydsl.binding.QuerydslBindings;
+import org.springframework.data.querydsl.binding.SingleValueBinding;
+
+public interface AddressRepository
+ extends JpaRepository, QueryDslPredicateExecutor, QuerydslBinderCustomizer {
+ @Override default void customize(final QuerydslBindings bindings, final QAddress root) {
+ bindings.bind(String.class).first((SingleValueBinding) StringExpression::eq);
+ }
+}
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/PersonRepository.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/PersonRepository.java
new file mode 100644
index 0000000000..7c37fb6b15
--- /dev/null
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/PersonRepository.java
@@ -0,0 +1,18 @@
+package com.baeldung.controller.repository;
+
+import com.baeldung.entity.Person;
+import com.baeldung.entity.QPerson;
+import com.querydsl.core.types.dsl.StringExpression;
+import com.querydsl.core.types.dsl.StringPath;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QueryDslPredicateExecutor;
+import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer;
+import org.springframework.data.querydsl.binding.QuerydslBindings;
+import org.springframework.data.querydsl.binding.SingleValueBinding;
+
+public interface PersonRepository
+ extends JpaRepository, QueryDslPredicateExecutor, QuerydslBinderCustomizer {
+ @Override default void customize(final QuerydslBindings bindings, final QPerson root) {
+ bindings.bind(String.class).first((SingleValueBinding) StringExpression::eq);
+ }
+}
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Address.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Address.java
new file mode 100644
index 0000000000..4f92031473
--- /dev/null
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Address.java
@@ -0,0 +1,45 @@
+package com.baeldung.entity;
+
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity public class Address {
+
+ @Id private String id;
+ private String address;
+ private String country;
+
+ public Address() {
+ }
+
+ public Address(String id, String address, String country) {
+ this.id = id;
+ this.address = address;
+ this.country = country;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+}
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Person.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Person.java
new file mode 100644
index 0000000000..779b1f84a9
--- /dev/null
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Person.java
@@ -0,0 +1,48 @@
+package com.baeldung.entity;
+
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+
+@Entity public class Person {
+
+ @Id private String id;
+ private String name;
+ @OneToOne @JoinColumn(name = "address") private com.baeldung.entity.Address address;
+
+ public Person() {
+ }
+
+ public Person(String id, String name, com.baeldung.entity.Address address) {
+ this.id = id;
+ this.name = name;
+ this.address = address;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public com.baeldung.entity.Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(com.baeldung.entity.Address address) {
+ this.address = address;
+ }
+}
diff --git a/spring-data-rest-querydsl/src/main/resources/application.yml b/spring-data-rest-querydsl/src/main/resources/application.yml
new file mode 100644
index 0000000000..c04c9d9ca0
--- /dev/null
+++ b/spring-data-rest-querydsl/src/main/resources/application.yml
@@ -0,0 +1,13 @@
+spring:
+ datasource:
+ driver-class-name: com.mysql.jdbc.Driver
+ hikari:
+ connection-timeout: 60000
+ maximum-pool-size: 5
+ pool-name: hikari-pool
+ url: jdbc:mysql://localhost:3306/baeldung?verifyServerCertificate=false&useSSL=false&requireSSL=false
+ username: root
+ password: admin
+ jpa:
+ hibernate:
+ ddl-auto: create-drop
diff --git a/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/SpringBootIntegrationTests.java b/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/SpringBootIntegrationTests.java
new file mode 100644
index 0000000000..803f0834bb
--- /dev/null
+++ b/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/SpringBootIntegrationTests.java
@@ -0,0 +1,43 @@
+package com.baeldung.springdatarestquerydsl;
+
+import com.baeldung.Application;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.nio.charset.Charset;
+
+import static org.hamcrest.Matchers.hasSize;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+
+@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @WebAppConfiguration
+public class SpringBootIntegrationTests {
+
+ @Autowired private WebApplicationContext webApplicationContext;
+
+ private MockMvc mockMvc;
+
+ @Before public void setupMockMvc() {
+ mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
+ }
+
+ @Test public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect() throws Exception {
+ MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(),
+ Charset.forName("utf8"));
+
+ mockMvc.perform(MockMvcRequestBuilders.get("/personQuery?name=john")).andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.content().contentType(contentType)).andExpect(jsonPath("$", hasSize(4)));
+ }
+}
+
+