HQL を使用して、2 つのドメイン間に新しく作成された関係を照会しようとしています。
だから私はこれに似た何かをしたい:
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}
私が提供している場合
'(1,2),(3,4)' のような :existingTuples の文字列、または
[new ImmutablePair(1L,2L), ..] のような org.apache.commons.lang3.tuple.Pair のリスト、または
[[1,2],[3,4]] のようなリストのリスト
このエラーが発生します
org.hibernate.util.JDBCExceptionReporter.logExceptions([...]) at Line 234
ERROR: arguments of row IN must all be row expressions
また、スパイログで確認しましたが、クエリは実行されません。生成された 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 (?)
このクエリを使用して not in ((1,2), (3,4)) を追加すると、機能します。
HQL をフォーマットする方法、または行要素になるように idTuples を提供する必要があるフォームを知っている人はいますか?