Как создать расширенный Hibernate Query с помощью OR и суммировать функции - PullRequest
1 голос
/ 14 декабря 2010

У меня довольно сложный запрос, который работает в SQL, но я хотел бы выразить это в HQL для переносимости.Я собираюсь получить настроенное пользователем значение предпочтения, если они существуют, если нет, я должен использовать значение по умолчанию.Это значение должно быть вычтено из текущей даты и сопоставлено со столбцом в таблице, в которой я заинтересован:

select d.id, d.guid, d.deletetimestamp, u.id 
from descriptor d, ownerkey ow, user u
where 
    d.parentid in 
        (select td.id 
         from descriptor td, store s 
         where s.type = 'Trash' 
         and s.descriptorid = td.id
        )
    and d.ownerkeyid = ow.id
    and ow.ownerid = u.id
    and 
       (
         (d.deletetimestamp < CURRENT_TIMESTAMP() - INTERVAL 
            (select pv.value 
             from preferencevalue pv, userpreference up
             where u.id = up.userid
             and up.preferenceid = 26 
             and up.value = pv.id) 
          DAY)
       or 
        (d.deletetimestamp < CURRENT_TIMESTAMP() - INTERVAL
            (select cast(pv.value as SIGNED) 
             from preferencevalue pv, defaultpreference dp
             where dp.preferenceid = 26
             and not exists(select up.userid from userpreference up where u.id = up.userid and up.preferenceid = 26)
             and dp.value = pv.id)
           DAY)
       )

Я пытаюсь построить это с помощью API Criteria, который, кажется, включает в себя большинствоиз логических операторов, которые мне нужны (равно, больше, или isEmpty / isNull), но не уверен, как бы я выразил все эти части.

Использование представления в данный момент не вариант, так как мы 'использование MySQL в качестве производственной базы данных, в то время как интеграционные тесты выполняются с базой данных H2.Я не могу найти функцию sstract substract в H2, в то время как MySQL поддерживает это.

Поля выбора не важны, поскольку они использовались только для целей тестирования.

1 Ответ

0 голосов
/ 09 марта 2011
  1. вы можете использовать Restrictions.disjunction() для или -и Restrictions.conjuction() для и предложений.
  2. Чтобы сослаться на определенное свойство объекта (например, pv.value), вы можете использовать Projections.property("value")
  3. для приведения, я не уверен, возможно, используя аннотацию @Formula на вашемюридическое лицо?Но это спящий режим, а не аннотация JPA.
  4. Насколько я знаю, нет эквивалента для INTERVAL в спящем режиме, но в таких случаях (возможно, также для приведенного выше приведения) вы можете использовать Restrictions.sqlRestriction("some sql...")

Будет сложно собрать все это вместе, чтобы преобразовать ваш запрос в критерии гибернации.

greetz,
Stijn

...