2014-11-01 2 views
3

У меня есть некоторые параметры, которые могут быть нулевыми или могут быть не пустыми.Параметр проверки JPQL не равен null, а затем выполнить запрос

Что я хочу сделать, так это выполнить запрос только с параметрами, которые не являются нулевыми.

Например, у меня есть:

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"); 
} 

Можно ли это сделать, не используя, если заявления но с jpql строки запроса? (потому что у меня есть более двух параметров, и это не очень удобно, чтобы проверить так много случаев)

+1

Вот что критерии API для: динамически построить запрос , –

ответ

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(); 
Смежные вопросы