gpt4 book ai didi

java - 使用 Querydsl 的 Spring Data JPA——按 URL 数组内的值进行过滤

转载 作者:行者123 更新时间:2023-12-01 09:42:28 27 4
gpt4 key购买 nike

假设我有 2 个实体。第一个实体是第二个实体的父实体,具有一对多关系。

class Item {
String name;
Integer price;
}

class Order {
List<Item> items;
String customerName;
}

我的存储库定义如下:

interface OrderRepository extends JpaRepository<Order, Long>, QueryDslPredicateExecutor<Order> {
}

之后,我有一个 Controller 可以自动将参数绑定(bind)到谓词,如下所示:

@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

谢谢。

最佳答案

这实际上是一个双重错误。即使您定义了如下所示的自定义绑定(bind),我们对点名称的翻译对于该特定场景来说也是错误的:

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

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

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

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

修复可用(尝试最新的快照),并计划在 Ingalls 里程碑以及 Hopper 和 Gosling 服务版本中进行修复。

关于java - 使用 Querydsl 的 Spring Data JPA——按 URL 数组内的值进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38346867/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com