繁体   English   中英

具有复杂类字段的Spring Data JPA规范标准

[英]Spring data jpa specification criteria with complex class field

我可以写下一个规范:

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);
        }
    };
}

但是,如果我想查找具有名称的驾驶员的所有订单,例如“鲍勃”。 我该怎么写这样的东西:

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,请帮忙,谢谢。

请替换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);
    }
};

}

用类似的表达式:

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)并告诉我们是否可行。 我现在无法测试,这就是为什么我要你这样做:)

我相信您想做的是:

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);
        }
    };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM