我正在尝试使用 HQL 查询两个域之间新创建的关系。
所以我想做类似的事情:
select x.id, y.id
from Author as x
join x.books as y
where (x.id, y.id) not in ((1,2),(3,4))
或者
select x.id, y.id
from Author as x
join x.books as y
where (x.id, y.id) not in (:existingTuples)
所以existingTuples 是我已经知道的相关ID。我想看看,创建了哪些关系。我知道使用 SQL 可以做到这一点,但是使用 HQL,我不必关心它是 1-1、1-n 还是 nm。
如果我直接在 HQL 中输入 ID,我会收到此错误:
org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: {vector}
如果我提供
:existingTuples 的字符串,例如 '(1,2),(3,4)',或
org.apache.commons.lang3.tuple.Pair 的列表,例如 [new ImmutablePair(1L,2L), ..],或
像 [[1,2],[3,4]] 这样的列表列表
我收到这个错误
org.hibernate.util.JDBCExceptionReporter.logExceptions([...]) at Line 234
ERROR: arguments of row IN must all be row expressions
我还检查了 spylog,查询永远不会被执行,生成的 SQL 如下所示:
select author0_.id as col_0_0_, books1_.id as col_1_0_
from author author0_
inner join book books1_ on author0_.id=books1_.author_id
where (author0_.id , books1_.id) not in (?)
如果我接受这个查询并且只在 ((1,2), (3,4)) 中添加 not ,它就可以工作。
任何人都知道如何格式化 HQL,或者我必须以哪种形式提供 idTuples,以便它们成为行元素?