Я также получил эту ошибку и исправил ее, добавив следующую ссылку:
using System.Data.Entity;
Поскольку вы выполняете конкатенацию в классе 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 будет делать в любом случае).
Если вы измените displayName на отображаемое свойство (установите для столбца name в Company и формулу наподобие first || '' || last in Person), тогда можно будет запросить Контракт и Hibernate выполнит два запроса, у каждого из которых теперь есть displayName. Вы получите список из двух списков, один из которых содержит компании, а другой - лиц, поэтому вам придется снова объединить их. Я думаю, вам нужно запросить полное имя пакета Contract или настроить typedef, чтобы сообщить об этом Hibernate.
Вы можете создать новый столбец в таблице Contact
, содержащий соответствующее displayName
, которое можно заполнить через Hibernate Перехватчик , поэтому он всегда будет автоматически содержать правильную строку.
Альтернативой может быть два запроса, один для Person
и один для таблицы Company
, каждый из которых содержит соответствующая логика поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).
Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%'
запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.
Альтернативой может быть два запроса: один для Person
и один для Компания
, каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).
Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%'
запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.
Альтернативой может быть два запроса: один для Person
и один для Компания
, каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).
Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%'
запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.
Person
и один для таблицы Company
, каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).
Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%'
запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.
Person
и один для таблицы Company
, каждая из которых содержит соответствующую логику поиска. Возможно, вам придется использовать собственные запросы для поиска конкатенированной строки с помощью запроса LIKE (я не эксперт по HQL, но это вполне возможно).
Если у вас большие таблицы, вам следует подумать о полнотекстовое индексирование, так как LIKE '% ...%'
запросы требуют полного сканирования таблицы, если ваша база данных не поддерживает полнотекстовые индексы.