Как выполнить, неполиморфный запрос HQL в В спящем режиме?

Я использую, в спящем режиме 3.1.1, и, в частности, я использую запросы HQL.

Согласно документации, запросы Hibernate являются полиморфными:

Запрос как: from Cat as cat экземпляры возвратов не только Cat, но также и подклассов как DomesticCat.

Как я могу запросить для экземпляров CAT, но не какого-либо из его подклассов?

Я хотел бы смочь сделать это, не имея необходимость явно упоминать каждый подкласс.

Я знаю о следующих опциях и не нахожу их удовлетворительными:

  1. Вручную фильтруя экземпляры после запроса, ИЛИ:
  2. Вручную добавляя оператор Where на столбце различителя.

Это имело бы смысл для, в спящем режиме, чтобы позволить пользователю решать, должен ли запрос быть полиморфным или нет, но я не могу найти такую опцию.

Заранее спасибо!

28
задан Bozho 18 November 2010 в 14:59
поделиться

5 ответов

использование полиморфизм = «Явный» в сопоставлении классов . Это приведет к тому, что запросы возвращают только экземпляры именованного класса и не его подклассов.

Неявный полиморфизм означает, что экземпляры класса будут возвращено запросом, которое имена любой суперкласс или реализованный интерфейс или класс, и что это случаи любого Подкласс класса будет возвращен по запросу, которое называет класс сам. Явный полиморфизм означает этот класс экземпляры будут возвращены Только по запросу, которые явное название этот класс

25
ответ дан 28 November 2019 в 03:11
поделиться

гораздо более простые решения для Определите вашу кнопку Callback с (ID) отправителем и используйте это Чтобы выкопать индекс строки таблицы. Вот несколько примерных кодов:

- (IBAction)buttonWasPressed:(id)sender
{
    NSIndexPath *indexPath =
        [self.myTableView
         indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    NSUInteger row = indexPath.row;

    // Do something with row index
}

, скорее всего, вы использовали тот же индекс строки для создания / заполнения ячейки, поэтому следует тривиально определить, что ваша кнопка теперь должна сделать. Не нужно играть с тегами и пытаться держать их в порядке!

Разъяснение: Если вы используете в настоящее время - (Ibaction) - (Ibaction) Buttonwased; Просто переопределяют его как - (Ibaction) Buttonwasured: (ID) отправитель; Дополнительный обратный аргумент Там нет необходимости делать что-то дополнительное, чтобы получить его. Также не забудьте подключить вашу кнопку до нового обратного вызова в интерфейсе Builder!

-121--2131543-
SELECT cat FROM Cat cat WHERE cat.class='cat'

, где значение «CAT» является значением дискриминатора CAT .

Если вы используете table_per_class , потом попробуйте CAT.class = 'Cat' ) (имя класса)

Это не точно A, где предложение в колонке дискриминатора, поскольку такой запрос не удастся (столбец дискриминатора доступен только в нативных запросах).

15
ответ дан 28 November 2019 в 03:11
поделиться

ARM MIMICS MIMICS The Java Model: если объект является экземпляром другого типа (если экземпляр Persiancat также является экземпляром CAT), любой запрос на кошке должен быть полиморфным ( Представьте, что вы запрашиваете список и спрашивая, какие записи совпадают INSTUCTOF CAT .

.

.

Даже решение Bozho несколько нечистое, поскольку столбец «класса» предположительно непрозрачен для вашего сопоставления в гибернации, хотя я признаю его очень Хороший компромисс. Вы можете просто получить дискриминатор через простое имя CLASSE.

Если вы удобны и , используют таблицу на класс Вы всегда можете сделать нативный запрос к Таблица кошек, чтобы получить идентификаторы, а затем получить записи через Hibernate.

1
ответ дан 28 November 2019 в 03:11
поделиться

Посмотрите на BaseQueryReturnFieldsCalculatorGC; он динамически добавляет условие к 'where', которое выбирает только where class=XXX; вы можете продублировать эту логику в HQLQueryTemplate и попросить пользователя определить 'isNonPolymorphic'.

Обратите внимание, что это будет работать только с таблицей-пер-иерархией, потому что только в этом случае неявный столбец class существует и может быть выбран.

0
ответ дан 28 November 2019 в 03:11
поделиться

JPA 2 (Hibernate 3.5) добавляет поддержку неполиморфных запросов, это очень похоже на свойство Hibernates .class (как Божо ответил выше), но не специфично для Hibernate. Это делается с помощью оператора TYPE. Как и в

Select b from Book b where TYPE(b) = Book

Вы можете прочитать больше о здесь это в моем блоге

Eyal

11
ответ дан 28 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: