编辑:相关: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,并且我需要找到一种方法为此做同样的事情:基本上将其转换为我可以用作的 Criterion 或 DetachedCriteria部分较大的表情。
我遇到的问题是,大多数类似的示例都有一个父子实体类,其中子类是一个真正的实体。因此,您可以创建标准,例如:
session.createCriteria(Parent.class, "p").createCriteria("tags").etc...
如果我尝试这样做,Hibernate 会抛出一个映射异常并抱怨“标签”不是关联。但是,映射是正确的。如果我查询父类型,它会在 Set 中很好地返回子标签——我只是不知道如何使用 Criteria、Subqueries、Restrictions、DetachedCriteria 等的某种组合来查询它。
我很想听听任何建议。