Hibernate Полиморфный оператор HQL SELECT - PullRequest
6 голосов
/ 30 ноября 2011

Я использую аннотацию Hibernate, чтобы сохранить мои занятия. В настоящее время я использую следующую стратегию для сопоставления классов

У меня есть абстрактный класс, который является классом Parent, и у меня есть два подкласса, которые наследуют его Мать, отец.

Я сопоставил это так:

@MappedSuperclass
public abstract class Parent {

private int age;
private String name;
...
}

И два других класса объявлены так:

@Entity
public Class Father extends Parent {

private boolean haveMustash;
...
}

Таким образом, в основном сценарий "Таблица на класс".

Теперь я хочу создать оператор Hibernate HQL, который будет обновлять возраст родителя независимо от его вида (мать, отец). родительский поиск будет выполняться с использованием столбца имени, который уникален в обеих таблицах. но я не знаю просто глядя на имя, если это Мать или Отец. Как мне создать оператор HQL, который будет выглядеть в обеих таблицах и вернуть нужную сущность для обновления?

Я думал о чем-то вроде этого: (но у меня нет идеи, если это вообще возможно)

Parent parent = hibernateTemplate.find("from Mother,Father where name="
        + name);

Ответы [ 4 ]

2 голосов
/ 30 ноября 2011
from Parent p where p.name = :name

(не проверено).

Обратите внимание, что если это сработает, это приведет к двум запросам, поскольку обе сущности не имеют ничего общего, за исключением того, что они наследуют некоторые сопоставленные атрибуты из суперкласса.У вас нет наследования сущностей и вы не реализуете таблицу для каждой стратегии класса.Вы бы сделали, если родительский элемент был аннотирован @Entity вместо @MappedSuperClass, и если вы определили стратегию наследования, используя @Inheritance.

1 голос
/ 13 ноября 2013

JB Низет ответ правильный.Используйте @Entity для отображения Parent вместо @MappedSuperclass.Это позволяет запускать запросы и обновления Hibernate на Parent (последний позволяет запускать его только на Father и Mother).Вы можете хранить таблицу для каждого класса с помощью аннотации @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS).

from Mother,Father не будет работать, поскольку это неявно объединяет таблицы.То, что вы хотите, это союз.Используя @Entity, Hibernate сделает это автоматически.

0 голосов
/ 18 марта 2019

Я опоздала на 7 лет, но все равно.

У меня на самом деле такая же проблема.У меня есть родительский класс @MappedSuperClass и два дочерних класса @Entity.Я не хочу делать родительский класс @Entity, но все же хотел бы извлечь выгоду из полиморфных запросов.Очевидно, в соответствии с https://www.baeldung.com/hibernate-inheritance, вы можете использовать:

from insert.full.package.name.here.Parent p where p.name = :name

, используя полное имя класса с его пакетом, хотя я еще не пробовал это.Я могу отредактировать этот пост после того, как попробовал это;) Надеюсь, это может помочь кому-то, столкнувшемуся с этой проблемой снова.

Редактировать: Так что, на самом деле, это прекрасно работает для меня :)

0 голосов
/ 30 ноября 2011

Согласно Hibernate Reference это работает!

Может появиться несколько классов, что приведет к декартовому произведению или кросс-соединению.

from Formula, Parameter

(см. 14.2)

Ссылка на Hibernate

Вы также можете выполнить поиск в обеих таблицах по отдельности, а затем проверить, какая из них не равна нулю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...