Запрос Hibernate Родитель / Ребенок с критериями подзапроса - PullRequest
1 голос
/ 15 ноября 2011

РЕДАКТИРОВАТЬ: релевантно: 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 с именем name.

Родительский класс отображает дочерний элемент как 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'.

Мне нужно перевести это в запрос на основе критериев, потому что мы используем Критерии для всех других свойств, и мне нужно найти способ сделать то же самое для этого: по сути, преобразовать это в Критерий или DetachedCriteria, которые я могу использовать как часть большего выражения .

Проблема, с которой я сталкиваюсь, состоит в том, что большинство похожих примеров имеют класс Parent и Child Entity, где дочерний класс является истинной сущностью. Таким образом, вы можете создать критерии как:

session.createCriteria (Parent.class, "p"). CreateCriteria ("tags") и т. Д. ...

Если я пытаюсь это сделать, Hibernate выдает исключение для сопоставления и жалуется, что теги не являются ассоциацией. Однако отображение верно. Если я запрашиваю родительские типы, он прекрасно возвращает мне дочерние теги в наборе - я просто не могу понять, как запросить его с помощью некоторой комбинации критериев, вложенных запросов, ограничений, DetachedCriteria и т. Д.

Я хотел бы услышать любые предложения.

...