使用子查询条件查询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