2015-07-03 53 views
1

我需要创建一个动态查询。我试图用JPQL来做,但不能。 例如:是否可以创建一个动态的JPQL查询?

public List get(String category, String name, Integer priceMin, Integer priceMax){ 
    List<Prod> list; 
    String query = "select p from Prod p where 1<2 "; 
    String queryCat=""; 
    String queryName=""; 
    String queryPriceMin=""; 
    String queryPriceMax=""; 
    String and = " and "; 
    if (!category.isEmpty()){ 
     query+=and+"p.cat.name=:category "; 
    } 
    if (!name.isEmpty()){ 
     query+=and+"p.name=:name "; 
    } 
    if (priceMin!=null){ 
     query+=and+"p.price>=:priceMin "; 

    } 
    if (priceMax!=null){ 
     query+=and+"p.price<=:priceMax "; 
    } 
    return list = entityManager.createQuery(query) 
      .setParameter("category", category) 
      .setParameter("name",name) 
      .setParameter("priceMin", priceMin) 
      .setParameter("priceMax", priceMax) 
      .getResultList(); 

} 

如果有所有的参数,查询运行,但如果没有这样的参数category我有例外java.lang.IllegalArgumentException: Parameter with that name [category] did not exist,我明白为什么会这样,但我怎么能避免这个问题?

回答

4

您可以试试。

public List<Prod> get(String category, String name, Integer priceMin, Integer priceMax){ 
    Map<String, Object> paramaterMap = new HashMap<String, Object>(); 
    List<String> whereCause = new ArrayList<String>(); 

    StringBuilder queryBuilder = new StringBuilder(); 
    queryBuilder.append("select p from Prod p "); 

    if (!category.isEmpty()){ 
     whereCause.add(" p.cat.name =:category "); 
     paramaterMap.put("category", category); 
    } 
    if (!name.isEmpty()){ 
     whereCause.add(" p.name =:name "); 
     paramaterMap.put("name", name); 
    } 
    if (priceMin!=null){ 
     whereCause.add(" p.price>=:priceMin "); 
     paramaterMap.put("priceMin", priceMin); 
    } 
    if (priceMax!=null){ 
     whereCause.add("p.price<=:priceMax "); 
     paramaterMap.put("priceMax", priceMax); 
    } 

    //................. 
    queryBuilder.append(" where " + StringUtils.join(whereCause, " and ")); 
    Query jpaQuery = entityManager.createQuery(queryBuilder.toString()); 

    for(String key :paramaterMap.keySet()) { 
      jpaQuery.setParameter(key, paramaterMap.get(key)); 
    } 

    return jpaQuery.getResultList(); 

} 
+0

是的,它在IDEA中工作,但是当我用MAVEN打包项目时,我得到这个错误:package com.sun.deploy.util does not exist。我需要添加依赖项? –

+0

请检查:http://stackoverflow.com/a/10667275/1638718 – ozgur