正如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。
1条答案
按热度按时间py49o6xq1#
hibernate不知道转换器如何将列表Map到列。它无法从jpql构建Map
? in userIds
匹配的sql片段,因为它需要知道转换器是如何实现的。但您可以自己构建sql片段,例如:
第一个
concat
是为了确保表达式匹配列表的第一个和最后一个值(不会以分隔符开头或结尾)。也可以使用其他特定于db的函数,但是这个示例适用于我所知道的所有数据库类型。
另一句话:你不应该试图加入
userIds
在查询中-因为它是一个基本类型,即使它是一个列表。请参阅的javadoc@Convert
:convert注解用于指定基本字段或属性的转换。
然而,如果直接将属性与文本进行比较,hibernate会抱怨(
entity.userIds = '1'
)因为属性的类型与文本的类型不匹配。但是,只要你对比较的任何一方使用上面这样的函数,它都不会抱怨。