編集: 関連: https://forum.hibernate.org/viewtopic.php?f=1&t=946236&start=0しかし、まだ解決策はありません。
親子関係があります。親は文字列タグのセットをマップします。簡略化された DDL:
CREATE TABLE PARENT (
ID NUMBER(38,0) NOT NULL,
{other columns here}
CONSTRAINT PK_PARENT PRIMARY KEY ("ID")
)
CREATE TABLE TAGS (
PARENT_ID NUMBER(38,0) NOT NULL,
NAME VARCHAR2(100) NOT NULL,
CONSTRAINT CHILD_PARENT_FK FOREIGN KEY ("PARENT_ID") REFERENCES PARENT("ID")
)
子テーブルには、親テーブルへの外部キーと、name という名前の varchar があります。
親クラスは子を Set としてマップします
public class Parent {
public Set<String> getTags() { return tags; }
public void setTags(Set<String> tags) { this.tags = tags; }
}
マッピング
<class name="com.example.Parent" table="parent">
<set name="tags" table="tags" order-by="name asc">
<key column="parent_id"/>
<element type="string" column="name"/>
</set>
</class>
このsqlRestrictionクエリは、私がやりたいことを正確に実行します。
return session.createCriteria(Parent.class)
.add(Restrictions.sqlRestriction(
"EXISTS (SELECT 1 FROM tags t WHERE t.parent_id = {alias}.id "+
"AND t.name in ('tag1', 'tag2', 'tag3') )" ) );
これにより、「tag1」、「tag2」、「tag3」のいずれかに一致するタグを持つすべての親オブジェクトが見つかります。
これを他のすべてのプロパティに Criteria を使用する Criteria ベースのクエリに変換する必要があります。これに対して同じことを行う方法を見つける必要があります。基本的にこれを Criterion または DetachedCriteria に変換して、より大きな式の一部。
私が抱えている問題は、類似しているほとんどの例には、親と子のエンティティ クラスがあり、子クラスは正真正銘のエンティティであるということです。したがって、次のような基準を作成できます。
session.createCriteria(Parent.class, "p").createCriteria("tags").etc...
これを行おうとすると、Hibernate はマッピング例外をスローし、「タグ」が関連付けではないことを訴えます。ただし、マッピングは正しいです。親タイプを照会すると、Set 内の子タグが正常に返されます。Criteria、Subqueries、Restrictions、DetachedCriteria などを組み合わせて照会する方法がわかりません。
提案があればぜひ聞きたいです。