Spring 带 Querydsl 的数据 JPA -- 按来自 URL 的数组内的值过滤
Spring Data JPA with Querydsl -- filter by value inside array from 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 过滤列表中的值。
注意:我使用 spring boot 1.3.4 和 querydsl-jpa 3.7.4
谢谢。
这实际上是一个双重错误。我们对点名称的翻译在特定情况下是错误的,即使您定义了这样的自定义绑定:
bindings.bind(user.addresses.any().street).as("alias").first(…);
这将是解决我们无法开箱即用地处理集合路径遍历问题的解决方案。
我已经提交 DATACMNS-883 给你解决这两个问题:
- 集合路径遍历应自动导致在路径具体化期间添加对
any()
的调用。
- 包含
any()
遍历的手动声明(和别名)路径绑定应该可以正常工作。
修复可用(尝试最新的快照)并计划用于 Ingalls 里程碑和 Hopper 和 Gosling 服务版本。
假设我有 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
谢谢。
这实际上是一个双重错误。我们对点名称的翻译在特定情况下是错误的,即使您定义了这样的自定义绑定:
bindings.bind(user.addresses.any().street).as("alias").first(…);
这将是解决我们无法开箱即用地处理集合路径遍历问题的解决方案。
我已经提交 DATACMNS-883 给你解决这两个问题:
- 集合路径遍历应自动导致在路径具体化期间添加对
any()
的调用。 - 包含
any()
遍历的手动声明(和别名)路径绑定应该可以正常工作。
修复可用(尝试最新的快照)并计划用于 Ingalls 里程碑和 Hopper 和 Gosling 服务版本。