[英]Spring Data JPA repository with specification, pagination and criteria fetch-join
[英]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.