编辑:相关: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'中的任何一个都匹配 .
I need to translate this into a Criteria based query b/c we use Criteria for all the other properties, and I need to find a way to do the same for this: essentially convert this into a Criterion or a DetachedCriteria that I can use as part of a larger expression .
我遇到的问题是大多数类似的例子都有一个Parent和Child Entity类,其中子类是一个真正的实体 . 因此,您可以创建标准:
session.createCriteria(Parent.class,“p”) . createCriteria(“tags”) . etc ...
如果我尝试这样做,Hibernate会抛出一个映射异常并抱怨“标签”不是关联 . 但是,映射是正确的 . 如果我查询父类型,它会在集合中返回子标签 - 我只是无法弄清楚如何使用Criteria,Subqueries,Restrictions,DetachedCriteria等的某种组合来查询它 .
我很乐意听到任何建议 .