5

我正在尝试使用 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,以便它们成为行元素?

4

0 回答 0