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);
和我们前面举的例子比起来是不是代码更加优雅、可读性更加强了?