РЕДАКТИРОВАТЬ: релевантно: 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 и т. Д.
Я хотел бы услышать любые предложения.