编辑:相关: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等的某种组合来查询它。
我很想听到任何建议。