Specification 工作中的一些扩展
我们在实际工作中会发现,如果上面的逻辑,简单重复写总感觉是不是可以抽出一些公用方法呢,此时引入一种工厂模式,帮我们做一些事情,可以让代码更加优雅。基于 JpaSpecificationExecutor 的思路,我们创建一个 SpecificationFactory.Java 内容如下:
public final class SpecificationFactory {
/**
* 模糊查询,匹配对应字段
*/
public static Specification containsLike(String attribute, String value) {
return (root, query, cb)-> cb.like(root.get(attribute), "%" + value + "%");
}
/**
* 某字段的值等于 value 的查询条件
*/
public static Specification equal(String attribute, Object value) {
return (root, query, cb) -> cb.equal(root.get(attribute),value);
}
/**
* 获取对应属性的值所在区间
*/
public static Specification isBetween(String attribute, int min, int max) {
return (root, query, cb) -> cb.between(root.get(attribute), min, max);
}
public static Specification isBetween(String attribute, double min, double max) {
return (root, query, cb) -> cb.between(root.get(attribute), min, max);
}
public static Specification isBetween(String attribute, Date min, Date max) {
return (root, query, cb) -> cb.between(root.get(attribute), min, max);
}
/**
* 通过属性名和集合实现 in 查询
*/
public static Specification in(String attribute, Collection c) {
return (root, query, cb) ->root.get(attribute).in(c);
}
/**
* 通过属性名构建大于等于 Value 的查询条件
*/
public static Specification greaterThan(String attribute, BigDecimal value) {
return (root, query, cb) ->cb.greaterThan(root.get(attribute),value);
}
public static Specification greaterThan(String attribute, Long value) {
return (root, query, cb) ->cb.greaterThan(root.get(attribute),value);
}
......
}
PS:可以根据实际工作需要和场景进行不断扩充。
调用实例1:
userRepository.findAll(
SpecificationFactory.containsLike("firstName", userParam.getLastName()),
pageable);
是不是发现代码一下子少了很多?
配合 Specifications 使用,调用实例2:
userRepository.findAll(Specifications.where(
SpecificationFactory.containsLike("firstName", userParam.getLastName()))
.and(SpecificationFactory.greaterThan("version",userParam.getVersion())),
pageable);
和我们前面举的例子比起来是不是代码更加优雅、可读性更加强了?