使用子查询条件查询Hibernate父/子

编辑:相关: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") 
)

子表具有父表的外键,以及名为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的查询b / c,我们使用Criteria来处理所有其他属性,并且我需要找到一种方法来做到这一点:实质上将其转换为Criterion或DetachedCriteria,我可以使用它作为一个更大的表达的一部分

我遇到的问题是,大多数类似的例子都有一个Parent和Child Entity类,其中的孩子类是一个真正的实体。 你可以这样创建Criteria:

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

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

我很想听听任何建议。

链接地址: http://www.djcxy.com/p/6315.html

上一篇: Querying Hibernate Parent/Child with Subquery Criteria

下一篇: hibernate OneToMany criteria returns duplicates