【发布时间】:2023-03-29 03:59:01
【问题描述】:
假设我有 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 过滤列表中的值。
注意:我使用 spring boot 1.3.4 和 querydsl-jpa 3.7.4
谢谢。
【问题讨论】:
-
您是否尝试过通过reference documentation 中描述的方式调整绑定,特别是QuerydslBinderCustomizer?
-
@OliverGierke 我尝试添加自定义绑定,但它也失败了。我认为问题出在
QuerydslPredicateBuilder#reifyPath附近,它试图访问item.name的路径,但ListPath<QItem>的字段没有导致NullPointerException的字段名称。我也在尝试自己实现它,但是我对代码库的了解很少。任何帮助将不胜感激。
标签: java spring spring-mvc spring-data-jpa querydsl