如何将带解码的查询转换为Hibernate(HQL)中的查询?

时间:2013-04-08 11:52:29

标签: oracle hibernate nhibernate nhibernate-mapping hql

我想将Oracle中的以下查询转换为Hibernate HQL查询

select 
      SYSTEM, 
      sum(decode(trim(XAXIS),'HIGH',YAXIS,0)) H,
      sum(decode(trim(XAXIS),'MEDIUM',YAXIS,0)) M, 
      sum(decode(trim(XAXIS),'LOW',YAXIS,0)) L
      from HOME 
      where
          DATA_KEY=5 
      GROUP BY SYSTEM

我希望使用createQuery()使其与数据库无关,并且不想使用Native SQL

如何在Hibernate中编写上述查询?

3 个答案:

答案 0 :(得分:0)

你为什么这样? HQL查询是基于字符串的,CreateSqlQuery也是如此。如果您使用Session.CreateSqlQuery(),则无需了解有关HQL语法的任何信息。

答案 1 :(得分:0)

首先,您必须创建名为Home的实体。 HQL不支持decode函数,但您可以使用如下公式创建属性:

<property name="prop1" type="Double" formula="decode(trim(XAXIS),'HIGH',YAXIS,0)" />
<property name="prop2" type="Double" formula="decode(trim(XAXIS),'MEDIUM',YAXIS,0)" />
<property name="prop3" type="Double" formula="decode(trim(XAXIS),'LOW',YAXIS,0)" />

然后你可以编写你的HQL查询:

select 
    h.SYSTEM, 
    sum(h.prop1) H,
    sum(h.prop2) M, 
    sum(h.prop3) L
from HOME h
where h.DATA_KEY=5 
GROUP BY h.SYSTEM

答案 2 :(得分:0)

您可以使用 case 而不是解码。

用例您的查询将从转换

select 
      SYSTEM, 
      sum(decode(trim(XAXIS),'HIGH',YAXIS,0)) H,
      sum(decode(trim(XAXIS),'MEDIUM',YAXIS,0)) M, 
      sum(decode(trim(XAXIS),'LOW',YAXIS,0)) L
      from HOME 
      where
          DATA_KEY=5 
  GROUP BY SYSTEM

select 
      SYSTEM, 
      sum(case when trim(XAXIS) = 'HIGH' then YAXIS else 0 end) H,
      sum(case when trim(XAXIS) = 'MEDIUM' then YAXIS else 0 end) M, 
      sum(case when trim(XAXIS) = 'LOW' then YAXIS else 0 end) L
      from HOME 
      where
          DATA_KEY=5 
      GROUP BY SYSTEM