diff --git a/README.md b/README.md index afbaf6e2..a341eebc 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ We have separate folders for the samples of individual modules: ## Spring Data web support * `web` - Example for Spring Data web integration (binding `Pageable` instances to Spring MVC controller methods, using interfaces to bind Spring MVCrequest payloads). +* `querydsl` - Example for Spring Data Querydsl web integration (creating a `Predicate` from web requests). ## Miscellaneous diff --git a/rest/starbucks/pom.xml b/rest/starbucks/pom.xml index 12c585c9..46e375ef 100644 --- a/rest/starbucks/pom.xml +++ b/rest/starbucks/pom.xml @@ -84,6 +84,31 @@ org.springframework.boot spring-boot-maven-plugin + + com.mysema.maven + apt-maven-plugin + ${apt.version} + + + com.mysema.querydsl + querydsl-apt + ${querydsl.version} + + + + + generate-sources + + process + + + target/generated-sources/annotations + org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor + true + + + + diff --git a/rest/starbucks/src/main/java/example/springdata/rest/stores/StoreRepository.java b/rest/starbucks/src/main/java/example/springdata/rest/stores/StoreRepository.java index 739f3360..3bd713b5 100644 --- a/rest/starbucks/src/main/java/example/springdata/rest/stores/StoreRepository.java +++ b/rest/starbucks/src/main/java/example/springdata/rest/stores/StoreRepository.java @@ -19,17 +19,35 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; +import org.springframework.data.querydsl.QueryDslPredicateExecutor; +import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer; +import org.springframework.data.querydsl.binding.QuerydslBindings; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.rest.core.annotation.RestResource; +import com.mysema.query.types.path.StringPath; + /** * Repository interface for out-of-the-box paginating access to {@link Store}s and a query method to find stores by * location and distance. * * @author Oliver Gierke */ -public interface StoreRepository extends PagingAndSortingRepository { +public interface StoreRepository extends PagingAndSortingRepository, QueryDslPredicateExecutor, + QuerydslBinderCustomizer { @RestResource(rel = "by-location") Page findByAddressLocationNear(Point location, Distance distance, Pageable pageable); + + /** + * Tweak the Querydsl binding if collection resources are filtered. + * + * @see org.springframework.data.web.querydsl.QuerydslBinderCustomizer#customize(org.springframework.data.web.querydsl.QuerydslBindings, + * com.mysema.query.types.EntityPath) + */ + default void customize(QuerydslBindings bindings, QStore store) { + + bindings.bind(store.address.city).first((path, value) -> path.endsWith(value)); + bindings.bind(String.class).first((StringPath path, String value) -> path.contains(value)); + } }