具有复杂类字段的Spring数据jpa规范标准

时间:2015-06-29 19:56:08

标签: java spring-data-jpa

我可以写下一个规范:

public static Specification<Order> filterByDriver(Driver driver) {
    return new Specification<Order>() {
        @Override
        public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            return cb.equal(root.get(Order_.driver), driver);
        }
    };
}

但如果我想找到所有带名字的司机订单,例如&#39; Bob&#39;。我该怎么写这样的东西:

public static Specification<Order> filterByDriverName(String driverName) {
    return new Specification<Order>() {
        @Override
        public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            return cb.equal(root.get(Order_.driver.name), driverName);
        }
    };
}

我正在使用spring-data-jpa:1.8.0.RELEASE,请帮助和谢谢。

2 个答案:

答案 0 :(得分:0)

请将return cb.equal(root.get(Order_.driver.name), driverName);替换为return cb.equal(root.get("driver").get("name"), driverName);

如果你想搜索一个字符串而不管它在你应该使用的确切名称中的位置

cb.like(cb.lower(root.get("driver").get("name")), ("%" + driverName + "%").toLowerCase())

完整解决方案(相等):

public static Specification<Order> filterByDriverName(String driverName) {
return new Specification<Order>() {
    @Override
    public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
        return cb.equal(root.get("driver").get("name"), driverName);
    }
};

}

使用like expresion:

public static Specification<Order> filterByDriverName(String driverName) {
return new Specification<Order>() {
    @Override
    public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
        return cb.like(cb.lower(root.get("driver").get("name")),  ("%" + driverName + "%").toLowerCase());
    }
};

}

我不知道元数据的解决方案,因为到目前为止我还没有使用它。我知道这不是类型安全的,但至少它解决了这个问题。

请尝试root.get(Order_.driver).get(String_.name)并告知我们是否有效。我现在无法测试这就是为什么我要求你这样做:)

答案 1 :(得分:0)

我相信你想要做的是:

public static Specification<Order> filterByDriverName(final String driverName) {
    return new Specification<Order>() {
        @Override
        public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            return cb.equal(root.get("driver").get("name"), driverName);
        }
    };
}