Использование IF-конструкции в Hibernate - PullRequest
3 голосов
/ 12 февраля 2011

Я использую конструкцию «if» в HSQL:

String q = "SELECT id, name, " +
                "IF (ABS(name) > 0, LPAD(ABS(name), 4, '0'), name) AS tord " +
                "FROM table where city= " + cityId + " order by tord";

    Query query = session.createSQLQuery(q);
    List<Object[]> list = query.list();
    session.getTransaction().commit();
    session.close();

И теперь я хочу реорганизовать этот кусок кода с помощью HQL.Как я могу это сделать?Спасибо.

1 Ответ

9 голосов
/ 12 февраля 2011

Вариант 1.

Заменить IF на CASE:

(case when ABS(name) > 0 then LPAD(ABS(name), 4, '0' else name end) AS tord

Подробнее см. HQL документация .

Вариант 2.

HQL поддерживает нативные функции. Если вы инкапсулируете вычисления в пользовательскую функцию SQL, вы можете написать что-то вроде:

select t.*, paddNumber(t.name, 4) as tord from TableEntity t 
where t.city = :city order by tord

Нет среды для проверки, но думаю, что каждая запись результата будет представлена ​​как Object []. Где первый элемент будет содержать вашу сущность, а второй - tord.

Вариант 3.

Если возможно, переписать логику приложения. Существуют разные способы добавить требуемый отступ в поле name перед сохранением записи. Это удалит ненужные вычисления в БД во время сортировки.

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