簡體   English   中英

如何使用動態參數創建JPA查詢?

[英]How create JPA query with dynamicly parameters?

我有這個方法:

 public List<User> getReport(String name, int age, String sName, Date bd, 

     String address, String msg2, int first, int pageSize) {
     List<User> result = new ArrayList<>();
     result = em.createQuery("from User u, User.class)
                    .setFirstResult(first)
                    .setMaxResults(pageSize)
                    .getResultList();
     return result;
    }

現在,此方法返回所有數據。 我需要動態調整參數。 我可以這樣做:

result = em.createQuery("from User u WHERE u.age = :age", User.class)
                    .setParameter("age", age)
                    .setFirstResult(first)
                    .setMaxResults(pageSize)
                    .getResultList();

但如果我的age是空的 - 我不會得到結果。 而另一個領域。

我需要一些像:

if(age != null){
em.createQuery("from User u WHERE u.age = :age", User.class)
                        .setParameter("age", age)
}

if(name!= null){
em.createQuery("from User u WHERE u.age = :age AND u.name= :name", User.class)
                        .setParameter("age", age)
}

我可以格式化字符串查詢,如:

String query = "from User u WHER";

他們連接這個字符串

if(age != null){
query = query +"u.age = :age";
em.createQuery("from User u WHERE u.age = :age", User.class)
                        .setParameter("age", age)
}

但我認為這是不好的做法。

我想你混淆了措辭。 通過使用類似u.age = :age類的東西,您可以使用動態參數 ,因為每次使用查詢時都可以更改年齡值。

您可能正在尋找的是動態查詢 雖然你可以通過連接字符串來實現這一點。 這只不過是構建自己的(小)查詢構建器。

JPA已經有了一個名為Criteria API的完整查詢構建器。 恕我直言,API不是自我解釋或易於學習,但谷歌很容易向您揭示很多讓您入門的例子。

當我創建動態查詢時,所有參數都在拾取地圖。

你可以試試。

public List<User> getReport(String name, Integer age, String sName, Date bd, 

 String address, String msg2, int first, int pageSize) {

    Map<String, Object> paramaterMap = new HashMap<String, Object>();
    List<String> whereCause = new ArrayList<String>();

    StringBuilder queryBuilder = new StringBuilder();
    queryBuilder.append("select u from User u ");

    if (!name.isEmpty()){
        whereCause.add(" u.name =:name ");
        paramaterMap.put("category", category);
    }
    if (age != null){
        whereCause.add(" u.age =:age ");
        paramaterMap.put("age", age);
    }
   if (!sName.isEmpty()){
        whereCause.add(" u.sName =:sName ");
        paramaterMap.put("sName", sName);
    }
    if (bd != null){
        whereCause.add(" u.bd =:bd ");
        paramaterMap.put("bd", bd);
    }
    if (!address.isEmpty()){
        whereCause.add(" u.address =:address ");
        paramaterMap.put("address", address);
    }
   if (!msg2.isEmpty()){
        whereCause.add(" u.msg2 =:msg2 ");
        paramaterMap.put("msg2", msg2);
    }

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

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

    jpaQuery.setFirstResult(first)
    jpaQuery.setMaxResults(pageSize)

    return  jpaQuery.getResultList();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM