编辑:相关: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'中的任何一个都匹配 .

I need to translate this into a Criteria based query b/c we use Criteria for all the other properties, and I need to find a way to do the same for this: essentially convert this into a Criterion or a DetachedCriteria that I can use as part of a larger expression .

我遇到的问题是大多数类似的例子都有一个Parent和Child Entity类,其中子类是一个真正的实体 . 因此,您可以创建标准:

session.createCriteria(Parent.class,“p”) . createCriteria(“tags”) . etc ...

如果我尝试这样做,Hibernate会抛出一个映射异常并抱怨“标签”不是关联 . 但是,映射是正确的 . 如果我查询父类型,它会在集合中返回子标签 - 我只是无法弄清楚如何使用Criteria,Subqueries,Restrictions,DetachedCriteria等的某种组合来查询它 .

我很乐意听到任何建议 .