在项目中使用到了jpa,从生疏到慢慢摸索熟悉,现将比较复杂的运用记录下来。
在使用jpa中,总会遇到比较复杂的查询。比如:分页,有分页一般就会少不了条件拼接查询,然后在加上一些排序、下拉选、模糊查询等等。这种情况我们就需要用到jpa中的Specification和它的@Overridepublic Predicate toPredicate(Root<Model> root, CriteriaQuery<?> query, CriteriaBuilder cb) {}方法了。这个可以自定义一些你需要的查询条件和查询方法以及排序分页等都能实现。
Specification<Model> sp = new Specification<Model>() {
@Override
public Predicate toPredicate(Root<Model> root, CriteriaQuery<?> query,CriteriaBuilder
cb) {
List<Predicate> list = new ArrayList<Predicate>();
Path<String> platform = root.get("platformName");
Path<Integer> app = root.get("appId");
Path<String> type = root.get("modelType");
Path<String> name = root.get("modelName");
if(StringUtils.isNotBlank(platformName)) {
list.add(cb.equal(platform, platformName));
}
if(StringUtils.isNotBlank(modelType)) {
list.add(cb.equal(type, modelType));
}
if(StringUtils.isNotBlank(String.valueOf(appId))) {
list.add(cb.equal(app, appId));
}
query.where(list.toArray(new Predicate[list.size()]));
}
};
还有其中in的用法
In<Object> in = cb.in(root.get("statusCode"));
in.value(Constant.MODEL_ADD);
in.value(Constant.MODEL_DISCONTINUATION);
list.add(in);
// 或者
In<Object> in = cb.in(root.get("id"));
for (String string : modelIds) {
in.value(string);
}
list.add(in);
模糊查询like的用法
list.add(cb.like(name, "%"+modelName+"%"));
排序
query.orderBy(cb.desc(root.get("modelName")));
分页
//分页信息(从0开始)
Pageable pageable = new PageRequest(pageNum-1,pageSize);
// 分页查询(sp就是Specification)
Page<Account> page = accountDao.findAll(sp,pageable);
// 总条数
long totalElements = page.getTotalElements();
// list集合
List<Account> content = page.getContent();