Критерии Hibernate API эквивалентны декодированию Oracle - PullRequest
1 голос
/ 02 мая 2011

Каким будет эквивалент функции Oracle DECODE () в Hibernate Criteria API?

Пример SQL, что мне нужно сделать:

SELECT DECODE(FIRST_NAME, NULL, LAST_NAME, FIRST_NAME) as NAME ORDER BY NAME;

Возвращает LAST_NAME NAME в случае, если FIRST_NAME равен NULL.

Я бы предпочел использовать Criteria API, но мог бы использовать HQL, если нет другого пути.

Ответы [ 4 ]

1 голос
/ 03 мая 2011

В качестве примера вы можете использовать COALESCE ().

Как имитировать NVL в HQL

1 голос
/ 03 мая 2011

Оформить org.hibernate.criterion.Projections.sqlProjection(...).

Аналогично этому ответу .

0 голосов
/ 09 мая 2011

Закончилось добавлением формулы для него:

<property name="name" formula="coalesce(first_name, last_name)"/>

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

0 голосов
/ 03 мая 2011

Вы можете использовать sqlRestriction для вызова собственной функции декодирования.

session.createCriteria (Table.class) .add (Restrictions.sqlRestriction ("decode ({псевдоним} .firstName, null, {alias} .lastName, {alias} .firstName) "))

В HQL у диалекта Oracle уже есть функции coalesce и nvl, или, если вам действительно нужно декодировать, вы можете создать подкласс диалекта и добавитьэто как пользовательская функция.Я не знаю, поддерживает ли Hibernate число аргументов переменной длины, как декодирование, но в худшем случае вы можете создать decode1, decode2 и т. Д. Для поддержки различного числа аргументов.

Или, если вы не 't, используя столбец в каталоге where или group by, вы можете просто вернуть оба атрибута и выполнить проверку в Java.

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