摘要:使用jpa-spec进行高级组合条件查询的用法
使用的插件
jpa-spec
1 2 3 4 5
   | <dependency>     <groupId>com.github.wenhao</groupId>     <artifactId>jpa-spec</artifactId>     <version>3.2.3</version> </dependency>
   | 
 
简单条件组合
1 2 3 4 5
   | Specification<BaseUser> spec = Specifications.<BaseUser>and()         .eq("prop1","value1")         .like(,"prop2","%value2%")         .build(); List<BaseUser> list = baseUserRepository.findAll(spec);
   | 
 
复杂条件组合
1 2 3 4 5 6 7 8 9 10 11 12 13
   | Specification<BaseUser> spec1 = Specifications.<BaseUser>or()   .eq("prop","value")   .eq("prop","value")   .build(); Specification<BaseUser> spec2 = Specifications.<BaseUser>or()   .eq("prop","value")   .eq("prop","value")   .build(); Specification<BaseUser> spec0 = Specifications.<BaseUser>and()   .predicate(spec1)   .predicate(spec2)   .build(); List<BaseUser> list = baseUserRepository.findAll(spec0);
   | 
 
解决条件in元素大于1000个时报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   |  private static <T> List<List<T>> handleSubList(List<T> strList, int size) {   List<List<T>> result = new ArrayList<>();   List<T> subList = null;   for (int i = 0, subIndex = 0; i < strList.size(); i++, subIndex++) {     if (subIndex == size) {       subIndex = 0;     }     if (subIndex == 0) {       subList = new ArrayList<>();       result.add(subList);     }     subList.add(strList.get(i));   }   return result; }
 
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   |  List<String> userIds = .... List<List<String>> subLists = handleSubList(userIds, 1000); PredicateBuilder<BaseUser> or = Specifications.<BaseUser>or(); for (List<String> subList : subLists) {   or.in("userId", subList); }
  Specification<BaseUser> userIdSpec = or.build(); Specification<BaseUser> spec = Specifications.<BaseUser>and()   .like(StringUtils.isNotBlank(account), "account", "%" + account + "%")   .like(StringUtils.isNotBlank(userCode), "userCode", "%" + userCode + "%")   .like(StringUtils.isNotBlank(realName), "realName", "%" + realName + "%")   .predicate(userIdSpec)   .ne("isDelete", 1)   .build(); Page<BaseUser> page = baseUserService.queryListForPage(spec, pageable);
 
  |