簡體   English   中英

JPA / JPQL查詢的where子句中的字符串列表標識

[英]String list identity in where clause of JPA / JPQL Query

說我有一個@Entity喜歡

class C {
  List<String> sequence;
}

我想查詢與給定列表完全匹配的C實例。 (我知道這是順序敏感的,我可以接受。)我正在使用EclipseLink並通過JPQL查詢。

我嘗試了明顯的方法:

List<String> querySeq = ... // some list to be used in the where clause
em.createQuery("select c from C c where c.sequence = :qs", C.class)
            .setParameter("qs", querySeq);

當我嘗試使用getResultList()執行查詢時,此操作將失敗。 錯誤是java.sql.SQLSyntaxErrorException: row column count mismatch

我也嘗試了join

select c from C c join c.sequence s where s in :qs

但這也失敗了,說The collection-valued path 'c.sequence' must resolve to an association field. 我對此的解釋是, join對原始元素的集合不起作用,而僅對關系起作用。

所以我的問題是:

什么是正確的方法?

另外,是否有一種方法可以對基本集合進行更復雜的操作,例如查詢(設置)交集,並集或差異?

經過對互聯網和JPA規范的研究,我發現我們無法使用JPQL比較兩個列表。

我建議選擇整個列表,然后使用Apache Commons CollectionUtils將其與第二個列表進行比較。 它提供了相交相減的功能。

我找不到任何可以使用JPQL直接比較列表的解決方案或文章。 但是,您可以使用一種機制來測試值是否為集合的成員

這個過程並不優雅,但是經過一些調整,我們可以構建一個與此類似的查詢(無法測試代碼,但是我認為它描述了這個想法,並且在邏輯上應該可行):

String query = "SELECT c FROM C c";
String checkValue = "";

for(int i = 0; i<queryString.size();i++){

    checkValue = queryString.get(i);

    if(i==queryString.size()-1){
        query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence";
    }else{
        query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence AND";
    }
}

暫無
暫無

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

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