2010-12-07 59 views
90

我建立了一個NamedQuery,看起來像這樣:添加IN子句列表的JPA查詢

@NamedQuery(name = "EventLog.viewDatesInclude", 
     query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " 
     + "el.timeMark <= :dateTo AND " 
     + "el.name IN (:inclList)") 

我想要做的就是填寫參數:inclList的項目,而不是一個項目的列表。例如,如果我有一個new List<String>() { "a", "b", "c" }我如何得到:inclList參數?它只讓我編一個字符串。例如:

setParameter("inclList", "a") // works 

setParameter("inclList", "a, b") // does not work 

setParameter("inclList", "'a', 'b'") // does not work 

setParameter("inclList", list) // throws an exception 

我知道我可以只建立一個字符串,並建立從整個查詢,但我想避免的開銷。有沒有更好的方法來做到這一點?

相關問題:如果列表非常大,是否有任何建立這樣的查詢的好方法?

回答

137

當使用IN與集合值參數不需要(...)

@NamedQuery(name = "EventLog.viewDatesInclude", 
    query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " 
    + "el.timeMark <= :dateTo AND " 
    + "el.name IN :inclList") 
+0

就是這樣,謝謝。 – AlanObject 2010-12-08 16:19:38

+6

不......我的情況正好相反。如果我使用:inclList,那麼它不起作用。如果我使用IN(:inclList),那麼它工作。 – 2012-11-24 10:27:53

+1

另請注意提及:您的參數的類型必須是對象的集合(而非數組)。對象必須與字段的類型匹配。 .toString()不能替代類String – dube 2014-03-21 10:47:12

26
public List<DealInfo> getDealInfos(List<String> dealIds) { 
     String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList"; 
     TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class); 
     query.setParameter("inclList", dealIds); 
     return query.getResultList(); 
    } 

與JPA 2時,JBoss 7.0.2

53

正確的JPA查詢格式爲我工作將是:

el.name IN :inclList 

如果您使用的是舊版本的Hibernate作爲您的公關ovider你必須寫:

el.name IN (:inclList) 

但是這是一個錯誤(HHH-5126)(編輯:已經通過現在已經得到解決)。

5

您必須轉換到List,如下圖所示:

String[] valores = hierarquia.split(".");  
    List<String> lista = Arrays.asList(valores); 

    String jpqlQuery = "SELECT a " + 
      "FROM AcessoScr a " + 
      "WHERE a.scr IN :param "; 

    Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class);     
    query.setParameter("param", lista);  
    List<AcessoScr> acessos = query.getResultList();