2014-11-01 59 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();