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

时间:2011-11-15 16:51:05

标签: hibernate criteria hibernate-criteria detachedcriteria

编辑:相关: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的查询b / c我们对所有其他属性使用Criteria,我需要找到一种方法来执行相同操作:实际上将此转换为标准或DetachedCriteria,我可以将其用作更大表达式的一部分

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

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

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

我很想听到任何建议。

0 个答案:

没有答案
相关问题