2012-08-08 80 views
1

我需要使用從Map獲取的參數進行查詢。在foreach中使用setParameter設置參數的JPA設置好像只設置了一個參數

public String executeQuery(String string, Map<String, String> params) {   
    try { 
     Query query = em.createQuery(string); 
     System.out.println(em.createQuery(string).getClass()); 
     for(String key:params.keySet()) { 
      query.setParameter(key, params.get(key)); 
      System.out.println("query.setParameter("+key+","+ params.get(key)+");");     
     } 
     List<?> list = query.getResultList();   
     return list.toString(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

偉大的以下工作:

Query query = em.createQuery("select u from User u where u.email=:email or u.name=:name"); 
query = query.setParameter("email","admin"); 
query = query.setParameter("name","name1"); 

List<?> list = query.getResultList(); 
return list.toString(); 

我得到的用戶兩個實例,一個是管理,一個用於姓名1。 但是,當我使用上面的代碼設置完全相同的查詢時,我只得到一個結果(通常用於後一個參數)。

是否使用:name或?1無關緊要。 foreach中的每個setParameter()都有正確的參數。 在foreach塊之後的查詢有兩個參數設置正確 - 我用它來檢查(1語法):

"Parameters: "+query.getParameter("name").getName()+ ": "+ query.getParameterValue("name")+", "+query.getParameter("email").getName() +": "+query.getParameterValue("email"); 

我用Glassfish的3.1.2,4.1.5休眠SP1,MySQL社區服務器5.5。 該方法置於無狀態會話bean中。

+0

是字符串中的executeQuery完全一樣的人在工作的例子嗎? – Korgen 2012-08-08 12:05:15

+0

是的。我嘗試了更多版本的問題,但是這個問題並不適用。 – tarsis 2012-08-08 14:26:42

回答

2

問題出在Map中,我從一個字符串中分解了新行分隔符的參數。 由於我使用的拆分參數\ n,在除最後一個單詞之外的所有單詞的末尾留下了一些空字符。

我應該用:

String[] lines = parameters.split(System.getProperty("line.separator"));