2014-11-01 79 views
3

我有一些參數可以爲null或不能爲空。JPQL檢查參數不爲空,然後執行查詢

我想要做的是隻使用非空參數執行查詢。

比如我有:

String param1; 
String param2; 

我想要做這樣的事情:

If (param1 != null && param2 != null) { 
    Query q = em.createQuery("SELECT a FROM Advert where a.property = param1 and a.property2= param2); 
} 

if(param1 == null && param2 != null) { 
    Query q = em.createQuery("SELECT a FROM Advert where a.property2= param2") 
} 

if(param1 != null && param2 == null) { 
    Query q = em.createQuery("SELECT a FROM Advert where a.property= param1"); 
} 

是否有可能做到這一點不使用if語句 但JPQL查詢字符串? (因爲我有兩個以上的參數,它是不太方便檢查這麼多的情況下)

+1

這是標準的API是什麼:動態地構造一個查詢。 – 2014-11-01 14:34:05

回答

1

你可以有這樣的事情:

 CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
     CriteriaQuery<Advert> query = criteriaBuilder.createQuery(Advert.class); 
     Root<Advert> advertRoot = query.from(Advert.class);   
     query.select(advertRoot); 
     List<Predicate> criteria = new ArrayList<Predicate>(); 
     if(property != null){ 
      ParameterExpression<String> p = 
        criteriaBuilder.parameter(String.class, "property"); 
      criteria.add(criteriaBuilder.equal(advertRoot.get("property"), p)); 
     } 
     if(property1 != null){ 
      ParameterExpression<String> p = 
        criteriaBuilder.parameter(String.class, "property1"); 
      criteria.add(criteriaBuilder.equal(advertRoot.get("property1"), p)); 
     } 
     if (criteria.size() == 0) { 
      throw new RuntimeException("no criteria"); 
     } else if (criteria.size() == 1) { 
      query.where(criteria.get(0)); 
     } else { 
      query.where(criteriaBuilder.and(criteria 
        .toArray(new Predicate[0]))); 
     } 
     TypedQuery<Advert> q = em.createQuery(query); 
     //set your query parameters here 
     if (property != null) { q.setParameter("property", property); } 
     if (property1 != null) { q.setParameter("property1", property1); } 
     List<Advert> resultList = q.getResultList();