Jpa的criteriaBuilder.in 使用


Criteria意為“標准、准則”,在數據庫中翻譯為“查詢條件”,所以CriteriaBuider就是Java提供的、用來生成查詢條件的“標准生成器”。

Criteria的in方法對應SOL語句中的IN關鍵字。
比如:

 

select *  from t_olympic_staiums y where y.id  in (1,2,3,4,5)

  網上查詢到例子為:

 

List<Predicate> predicates = new ArrayList<>();
if(companyEntities != null && companyEntities.size()>0){
	  Path<Object> path = root.get("maintainUnitId");  //定義查詢的字段
	  CriteriaBuilder.In<Object> in = criteriaBuilder.in(path);
	  for (int i = 0; i <companyEntities.size() ; i++) {
	      in.value(companyEntities.get(i).getId());//存入值
	  }
predicates.add(criteriaBuilder.and(criteriaBuilder.and(in)));//存入條件集合里

  

注意:使用buider構建一個in的查詢規則,in()的參數是被查詢的對象中的某個屬性(比如學生的班級)

實際開發中使用:

 

   /**
	 * 字符串類型模糊查詢示例:
	 * Predicate predicate = cb.like(root.get("employeeName"), "%" + 三 + "%");  查詢名字中含有“三”的員工
	 * 數字類型or時間類型示例:
	 * Predicate predicate = cb.equal(root.get("age"), 26); 查詢年齡為26的員工
	 * Predicate predicate = cb.ge(root.get("age"), 26);	 查詢年齡大於26的員工  同理大於等於為gt
     * Predicate predicate = cb.le(root.get("age"), 26);	 查詢年齡小於26的員工  同理小於等於為lt
     * Predicate predicate = cb.between(root.get("age"), 26, 30);查詢年齡在26與30之間的員工
	 * 若查詢條件為時間類型,需用DateTimeConverter類的toDate方法將條件轉換為對應的日期類型,然后進行查詢
	 * 例如:Date date = (Date) DateTimeConverter.toDate(Date.class, queryFilter.getValue()); Predicate predicate = cb.equal(namePath, date); 
	 * @queryCommon:查詢方法(通用的)
	 * @param queryCondition 查詢條件
	 * @return QueryResultObject 查詢結果
	 */
 public Predicate toPredicate(Root<TStadiumsLoad> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
		List<Predicate> preList = new ArrayList<Predicate>();
		if(qList != null && !qList.isEmpty()){
				for(QueryFilter queryFilter : qList){
					Path<String> namePath = root.get(queryFilter.getFieldName());
						Predicate predicate =null;
						if(queryFilter.getFieldName().equals("stationRoom") ){
							predicate = cb.like(namePath, "%" + queryFilter.getValue() + "%");
						}else if(queryFilter.getFieldName().equals("stadiumId")){
							String olympicName = (String) queryFilter.getValue();//國家體育
							List list=tOlympicStadiumsMapper.findOlympicStadiumIdByName(olympicName);//查詢名稱為國家體育的所有id
							CriteriaBuilder.In<String> in = cb.in(namePath);
							for (int i = 0; i < list.size(); i++) {
								Map map=(Map)list.get(i);
								String stadiumId=map.get("stadiumId").toString();
								in.value(stadiumId);
							}
							predicate = cb.and(cb.and(in));
						}else{
							predicate = cb.equal(namePath, queryFilter.getValue());
						}
						preList.add(predicate);
					}
					query.where(preList.toArray(new Predicate[preList.size()]));
				}
				preList.clear();
				return null;
	}

  更多java、大數據學習面試資料,請掃碼關注我的公眾號:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM