在項目中使用到了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();