簡體   English   中英

使用 AttributeConverter 存儲的列表中項目的 JPQL 查詢

[英]JPQL query for item in list stored with AttributeConverter

正如 Tobias Liefke 在這里建議的那樣,我已經實現了一個AttributeConverter來將列表值存儲到由逗號分隔的單個字符串列中。

轉換器類:

public class ListNumbersConverter implements AttributeConverter<List<Long>, String>

實體類中的字段:

@Column(name = "user_ids", nullable = false)
@Convert(converter = ListNumbersConverter.class)
private List<Long> userIds;

它工作正常,但我無法查詢特定列表項的記錄。 我嘗試在 JPQL 查詢中使用IN運算符,如下所示:

? in userIds 

有了這個,如果輸入參數是數據庫值中的第一個元素,我只會得到一個結果。 例如:DB 值為“1,2,3”。 如果上述查詢的輸入參數值為 1,我可以檢索此記錄,但如果值為 2 或 3,則無法檢索。如何編寫查詢以檢索包含特定項目的所有記錄?

我的數據庫是 MySQL。

Hibernate 不知道轉換器如何將列表映射到列。 它無法從 JPQL 構建映射? in userIds ? in userIds到匹配的 SQL 片段中,因為它需要知道您的轉換器是如何實現的。

但是您始終可以自己構建該 SQL 片段,例如:

WHERE concat(',', entity.userIds, ',') LIKE concat('%,', ?, ',%')

第一個concat是確保表達式甚至匹配列表的第一個和最后一個值(不會以分隔符開頭或結尾)。

還有其他特定於數據庫的函數可以使用,但這個例子適用於我知道的所有數據庫類型。

另一個備注:您不應該嘗試在查詢中加入userIds - 因為它是一個基本類型,即使它是一個列表。 請參閱@Convert的 JavaDoc :

Convert 注釋用於指定基本字段或屬性的轉換。

盡管如此,如果您將屬性直接與文字( entity.userIds = '1' )進行比較,Hibernate 會抱怨,因為屬性的類型與文字的類型不匹配。 但是只要您在比較的任一側使用上述函數,它就不會抱怨。

暫無
暫無

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

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