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))); + } +} + +