jpql查询attributeconverter存储的列表中的项

ca1c2owp  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(370)

正如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;

它工作正常,但我无法查询特定列表项的记录。我试过用 IN jpql查询中的运算符如下所示:

? in userIds

只有当input param是db值中的第一个元素时,我才得到一个结果。e、 g:db值为“1,2,3”。如果上述查询的input param值为1,则我可以检索该记录,但如果值为2或3,则无法检索。如何编写查询来检索包含特定项的所有记录?
我的数据库是mysql。

py49o6xq

py49o6xq1#

hibernate不知道转换器如何将列表Map到列。它无法从jpql构建Map ? in userIds 匹配的sql片段,因为它需要知道转换器是如何实现的。
但您可以自己构建sql片段,例如:

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

第一个 concat 是为了确保表达式匹配列表的第一个和最后一个值(不会以分隔符开头或结尾)。
也可以使用其他特定于db的函数,但是这个示例适用于我所知道的所有数据库类型。
另一句话:你不应该试图加入 userIds 在查询中-因为它是一个基本类型,即使它是一个列表。请参阅的javadoc @Convert :
convert注解用于指定基本字段或属性的转换。
然而,如果直接将属性与文本进行比较,hibernate会抱怨( entity.userIds = '1' )因为属性的类型与文本的类型不匹配。但是,只要你对比较的任何一方使用上面这样的函数,它都不会抱怨。

相关问题