2010-12-14 25 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