2014-01-19 2 views
2

При чтении Hibernate в действии (Кристина Бауэр & Gavin King) я наткнулся на следующую секцию в chapter7Hibernate Полиморфные запросы

7.2.3 полиморфных запросов мы описали HQL как объектно-ориентированный язык запросов, поэтому он должен поддерживают полиморфные запросы, то есть запросы для экземпляров класса и всех экземпляров его подклассов, соответственно. Вы уже знаете достаточно HQL, что мы можем это продемонстрировать. Рассмотрим следующий запрос:

от BillingDetails

Этот запрос возвращает объекты из BillingDetails типа, который является абстрактным классом. Итак, в этом случае конкретные объекты относятся к подтипам BillingDetails: CreditCard и BankAccount. Если мы хотим экземпляров конкретного подкласса, мы можем использовать

из Creditcard

Класс назван в ЕКЕ не должен быть отображен персистентным классом; любой класс будет делать. Следующий запрос возвращает все постоянные объекты:

из java.lang.Object

Конечно, это также работает для интерфейсов, этот запрос возвращает все сериализуемые постоянные объекты:

из java.io.Serializable

Критерии запросов также поддерживают полиморфизм:

session.createCriteria (BillingDetails.class) .list();

Этот запрос возвращает экземпляры BillingDetails и его подклассов. Аналогично, следующий запрос критериев возвращает все постоянные объекты:

session.createCriteria (java.lang.Object.class) .list();

Полиморфизм применяется не только к классам, явно указанным в предложении from, но также к полиморфным ассоциациям, как вы увидите ниже.

Вопрос: Каково использование полиморфных запросов. Как и когда он используется.

+1

Разве это не очевидно из того, что вы опубликовали? Предположим, что вам нужны все платежные данные, независимо от их типа (кредитная карта или банковский счет): вам не нужно выставлять один w-запрос для каждого конкретного подкласса: достаточно одного запроса, который выбирает BillingDetails. –

ответ

-2

java beats опубликовали хороший ответ для полиморфных запросов.

http://javabeat.net/implicit-polymorphism-hibernate/

Update: My плохо, забыл упомянуть, что они использовали пример для объяснения полиморфных запросов, вот он идет:

Предположим, у нас есть два класса CreditCardPayment и DebitCardPayment, и оба из них расширяет Суперклас платежей, и каждый из этих трех классов имеет свои собственные таблицы в базе данных, поскольку используется таблица для стратегии класса. В какой-то момент, если мы хотим получить список всех платежей, сделанных с помощью наличных или карточек, ниже запрос будет делать магию.

session.createCriteria (Payment.class).список();

При обработке этого критерии запроса, спящий режим выполните следующие операции -

Идентифицировать все подклассы оплаты, которые отображаются в любой таблице огня отдельного запроса для всех таблиц Объединить результат всех запросов в list и return from hibernate layer

Хотя, hibernate делает это внутри, но нам действительно нужен только один запрос для извлечения всех данных обоих типов карт. Следовательно, запрос, используемый в hql, является полиморфным.

Смежные вопросы