1

编辑:相关: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 等的某种组合来查询它。

我很想听听任何建议。

4

0 回答 0