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 для вас, чтобы решить обе проблемы:

  1. Обход пути сбора должен автоматически привести к вызову any() добавлено во время пути пути.
  2. Объявленные вручную (и псевдонимы) привязки пути, включая any() Обход должен работать правильно.

Исправление доступно (попробуйте последние снимки) и запланировано как для этапа Ingalls, так и для сервисного выпуска Hopper and Gosling.

Другие вопросы по тегам