Spring Data JPA с Querydsl - фильтр по значению в массиве из URL
Предполагается, что у меня есть 2 лица. Первый объект является родителем второго объекта с отношением "один ко многим".
class Item {
String name;
Integer price;
}
class Order {
List<Item> items;
String customerName;
}
И у меня есть хранилище, определенное так:
interface OrderRepository extends JpaRepository<Order, Long>, QueryDslPredicateExecutor<Order> {
}
После этого у меня есть контроллер, который автоматически связывает параметр для предиката, например:
@RestController
@RequestMapping(path = "/orders")
class OrderController {
@RequestMapping(method = RequestMethod.GET)
List<Order> list(@QuerydslPredicate Predicate predicate) {
return orderRepository.findAll(predicate);
}
}
Итак, я могу запросить заказ из репозитория с помощью специального фильтра, например:curl -XGET http://localhost/orders?customerName=John
Проблема в том, что я не могу отфильтровать значение внутри списка. Я тоже стараюсь http://localhost/orders?items.name=Bag
но получил NullPointerException
java.lang.NullPointerException
at org.springframework.util.ReflectionUtils.getField(ReflectionUtils.java:143) ~[spring-core-4.2.6.RELEASE.jar:4.2.6.RELEASE]
at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.reifyPath(QuerydslPredicateBuilder.java:185) ~[spring-data-commons-1.11.4.RELEASE.jar:?]
...
Итак, вопрос в том, как я могу отфильтровать значения внутри списка с помощью Spring JPA и Querydsl.
Примечание: я использую весеннюю загрузку 1.3.4 с querydsl-jpa 3.7.4
Благодарю.
1 ответ
На самом деле это двойная ошибка. Наш перевод в точечные имена не работает для этого конкретного сценария, даже если вы определили пользовательскую привязку, подобную этой:
bindings.bind(user.addresses.any().street).as("alias").first(…);
это было бы решением для обхода нашей неспособности обработать обход пути сбора данных из коробки.
Я подал DATACMNS-883 для вас, чтобы решить обе проблемы:
- Обход пути сбора должен автоматически привести к вызову
any()
добавлено во время пути пути. - Объявленные вручную (и псевдонимы) привязки пути, включая
any()
Обход должен работать правильно.
Исправление доступно (попробуйте последние снимки) и запланировано как для этапа Ingalls, так и для сервисного выпуска Hopper and Gosling.