将 IN 子句列表添加到 JPA 查询

2022-08-31 07:40:59

我构建了一个如下所示的 NamedQuery:

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

我想做的是用项目列表而不是一个项目来填充参数:inclList。例如,如果我有一个如何在:inclList参数中获取它?它只允许我编纂一个字符串。例如:new List<String>() { "a", "b", "c" }

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

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

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

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

我知道我可以只构建一个字符串并从中构建整个查询,但我想避免开销。有没有更好的方法来做到这一点?

相关问题:如果列表非常大,是否有任何好的方法可以构建这样的查询?


答案 1

与集合值参数一起使用时,您不需要:IN(...)

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

答案 2

正确的 JPA 查询格式是:

el.name IN :inclList

如果您使用较旧版本的Hibernate作为您的提供商,则必须编写:

el.name IN (:inclList)

但这是一个错误(HHH-5126)(编辑:现在已经解决了)。


推荐