2010-12-14 61 views
1

我有一個相當複雜的查詢,它在SQL中工作,但我想在HQL中爲便攜性表達這一點。如果不存在,我將獲取用戶配置的首選項值,如果不存在,我必須使用默認值。該值必須從當前日期中減去,並針對表中的列,我很感興趣的匹配:如何使用OR構建高級Hibernate查詢並對功能進行彙總

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,它似乎包括大部分我需要的邏輯運算符(等於,大於或isEmpty/isNull),但不知道如何表達所有這些部分。

此時使用視圖並不是一種選擇,因爲我們使用MySQL作爲生產數據庫,而集成測試使用H2 inmemory數據庫運行。我無法在H2中找到sata減法函數,而MySQL支持這一點。

選擇字段並不重要,因爲它們只用於測試目的。

回答

0
  1. 您可以使用Restrictions.disjunction()作爲或-and和Restrictions.conjuction()作爲和子句。
  2. 要引用的實體(如pv.value)的某些屬性,你可以使用Projections.property("value")
  3. 爲鑄件我不知道,也許使用你的實體@Formula註解?但這是一個休眠而不是JPA註釋。
  4. 據我知道有沒有類似休眠INTERVAL,但在這種情況下(也許也是上面鑄),你可以使用Restrictions.sqlRestriction("some sql...")

這將是把所有的這一起變換挑戰你的查詢到休眠條件。

greetz,
Stijn