spring jpa之複雜查詢(分頁,條件,模糊等)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章