【问题标题】:Spring Data JPA with Querydsl -- filter by value inside array from URL带有 Querydsl 的 Spring Data JPA——按 URL 中的数组内的值过滤
【发布时间】: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&lt;QItem&gt; 的字段没有导致NullPointerException 的字段名称。我也在尝试自己实现它,但是我对代码库的了解很少。任何帮助将不胜感激。

标签: java spring spring-mvc spring-data-jpa querydsl


【解决方案1】:

这实际上是一个双重错误。即使您定义了这样的自定义绑定,我们对点名称的翻译也会因该特定情况而中断:

bindings.bind(user.addresses.any().street).as("alias").first(…);

这将是解决我们无法处理开箱即用的集合路径遍历问题的解决方案。

我已提交DATACMNS-883 为您解决这两个问题:

  1. 集合路径遍历应自动导致在路径具体化期间添加对any() 的调用。
  2. 包括any() 遍历在内的手动声明(和别名)路径绑定应该可以正常工作。

修复可用(尝试最新快照)并计划在 Ingalls 里程碑和 Hopper 和 Gosling 服务版本中发布。

【讨论】:

    猜你喜欢
    • 2020-01-12
    • 2020-06-16
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2016-02-17
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多