带有Querydsl的Spring Data JPA - 按URL中的数组内的值进行过滤

时间:2016-07-13 08:50:07

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

假设我有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

感谢。

1 个答案:

答案 0 :(得分:1)

实际上这是一个双重错误。即使您定义了这样的自定义绑定,我们对该点的名称也会被打破,即使您定义了这样的自定义绑定:

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

这将成为解决我们未能处理开箱即用的集合路径的解决方案。

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

  1. 收集路径遍历应自动导致在路径确定期间添加any()的调用。
  2. 包含any()遍历的手动声明(和别名)路径绑定应该可以正常工作。
  3. 可以使用Fix(尝试最新的快照)并安排Ingalls里程碑和Hopper and Gosling服务版本。