jpa吧 关注:33贴子:35
  • 0回复贴,共1

jpa-springboot中Specification重写toPredicate拼接条件查询

取消只看楼主收藏回复

//在公司企业项目用户管理模块中,使用jpa做的一个查询用户登陆日志功能
@override //实现类
public ResponseMessageObj<Object> finduserLog(ParamsTable pt) {
try {
ResponseMessageObj<Object> retObj = new ResponseMessageObj<>();
Integer pageNum = Integer.parseInt(pt.getParameterAsString("pageNum")); //当前页码
Integer pageSize = Integer.parseInt(pt.getParameterAsString("pageSize")) //每页分几行
String userId = pt.getParameterAsString("digitalId"); //用户id
String createTime1 = pt.getParameterAsString("createTime1"); //开始时间
String createTime2 = pt.getParameterAsString("createTime2"); //结束时间
if (pageNum==null) pageNum=1
if (pageSize == null) pageSize = 10
Condition<UserLoginLog> condition = new Condition<UserLoginLog>(); //这是我写的自定义查询条件拼接类
Map<String, String> map = new HashMap<String, String>();
map.put("userId", userId);
map.put("addTime1", createTime1);
map.put("addTime2", createTime2);
Specification<UserLoginLog> specification = condition.userLogConditon(map); //传入参数拼接sql
Sort sort = new Sort(Sort.Direction.DESC, "addTime"); //根据时间排序,值写实体类属性
Pageable pageable = new PageRequest(pageNum - 1, pageSize, sort);// (当前页, 每页记录数, 排序方式)
Page<UserLoginLog> list = userLoginLogtRepository.findAll(specification,pageable);//直接调用jpa自带的查询方法即可,返回值就已经是根据id查询,和用户在两个时间登陆之间的数据。
Map<String, Object> m = new HashMap<>();
m.put("list",list);
retObj.setResultCode(ResultCodeConstant.CODE_0000);
retObj.setResultMsg("成功");
retObj.setRespBody(m);
return retObj;
} catch (Exception e) {
logger.error(e.getMessage(), e);
throw new RuntimeException(e);
}
Condition自定义类
package cn.gov.hunanjs.common.util;
public class Condition<T>{
/*用户登录记录拼接条件*/
public Specification<T> userLogConditon(final Map<String, String> paramsMap) {
Specification<T> specification = new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
Iterator<String> iter = paramsMap.keySet().iterator();
List<Predicate> predicates = new ArrayList<>();
while (iter.hasNext()) {
String key = iter.next();
String value = paramsMap.get(key);
if (StringUtils.isBlank(value))
continue;
if (key.equals("userId"))
predicates.add(criteriaBuilder.equal(root.get("userId").as(String.class), value));
if (key.equals("addTime1"))
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("addTime").as(String.class), value));
if (key.equals("addTime2"))
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("addTime").as(String.class), value));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
return specification;
}
}


1楼2019-12-25 14:29回复