Будьте в спящем режиме полиморфный запрос

Я также получил эту ошибку и исправил ее, добавив следующую ссылку:

using System.Data.Entity;
6
задан dma_k 19 September 2011 в 16:54
поделиться

3 ответа

Поскольку вы выполняете конкатенацию в классе Java, Hibernate никак не может помочь вам с этим, извините. Он может просто не видеть, что вы делаете в этом методе, поскольку на самом деле это вообще не связано с персистентностью.

Решение зависит от того, как вы сопоставили наследование этих классов:

Если это таблица-на -hierarchy вы можете использовать этот подход: напишите предложение SQL where для запроса с критериями, а затем используйте оператор case:

s.createCriteria(Contact.class)
 .add(Restrictions.sqlRestriction("? = case when type='Person' then firstName || ' '|| lastName else name end"))
 .list();

Если это таблица для каждого конкретного подкласса, тогда вам лучше написать два запроса (поскольку это что Hibernate будет делать в любом случае).

4
ответ дан 17 December 2019 в 00:13
поделиться

Если вы измените displayName на отображаемое свойство (установите для столбца name в Company и формулу наподобие first || '' || last in Person), тогда можно будет запросить Контракт и Hibernate выполнит два запроса, у каждого из которых теперь есть displayName. Вы получите список из двух списков, один из которых содержит компании, а другой - лиц, поэтому вам придется снова объединить их. Я думаю, вам нужно запросить полное имя пакета Contract или настроить typedef, чтобы сообщить об этом Hibernate.

1
ответ дан 17 December 2019 в 00:13
поделиться

Вы можете создать новый столбец в таблице Contact , содержащий соответствующее displayName , которое можно заполнить через Hibernate Перехватчик , поэтому он всегда будет автоматически содержать правильную строку.

Альтернативой может быть два запроса, один для Person и один для таблицы Company , каждый из которых содержит соответствующая логика поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).

Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%' запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.

которые вы можете заполнить через Hibernate Interceptor , чтобы он всегда автоматически содержал правильную строку.

Альтернативой может быть два запроса: один для Person и один для Компания , каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).

Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%' запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.

которые вы можете заполнить через Hibernate Interceptor , чтобы он всегда автоматически содержал правильную строку.

Альтернативой может быть два запроса: один для Person и один для Компания , каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).

Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%' запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.

один для таблицы Person и один для таблицы Company , каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).

Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%' запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.

один для таблицы Person и один для таблицы Company , каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).

Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%' запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.

2
ответ дан 17 December 2019 в 00:13
поделиться
Другие вопросы по тегам:

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