在HQL中使用CASE语句选择

时间:2009-01-19 00:10:34

标签: nhibernate hibernate hql

有没有办法在HQL中执行以下操作:

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable

7 个答案:

答案 0 :(得分:10)

我猜你可以(3.64.3 [内联编辑] ... for where-clauses:

  

“简单”案例,case ... when ... then ... else ... end和“已搜查”案例case when ... then ... else ... end

答案 1 :(得分:5)

显然,执行此操作的能力为added in 3.0.4,但您无法在else子句中使用子选项。

答案 2 :(得分:5)

请参阅Hibernate-Forum:https://forum.hibernate.org/viewtopic.php?t=942197

Team(Gavin)的回答: case子句支持case,但不支持HB3中的select子句。

在JIRA中看到状态为“未解决”。

答案 3 :(得分:4)

下面你可以找到一个工作查询(postgresql上的hibernate),它使用2个case语句用相应的文本表示替换boolean值。

  

SELECT CASE ps.open WHEN true那么   '打开'其他'关闭'结束,例如   ps.full什么时候真的那么'完全'否则   'FREE'END,ps.availableCapacity   FROM ParkingState as ps

答案 4 :(得分:0)

我们广泛使用了休眠HQL查询,我认为最终有一种做这种事情的方法:

假设我们最初有一个查询

i2.element.id = :someId

然后决定将其扩展为以下形式:

((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))

但是有一个问题,我们希望它仅基于classType查找此内容,因此需要一个case语句:

(case when type(i)=Item then 
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
else
i.element.id = :someId
end)

以上操作无效,您可以通过以下操作使上述工作变得简单:

(case when type(i)=Item then 
i2.element.id
else
i.element.id
end)=:elementId

但这实际上并没有完成我们需要做的事情,我们希望它完全在查询中完成,因此知道您可以在case语句的末尾在HQL所在的位置分配一个变量:

(
                            (
                                (case when 
                                    type(r)=Item then 
                                        i.element.id 
                                    else 
                                        i.element.id end) = :elementId 
                                and 
                                (case when 
                                    type(r)=Item then 
                                        i2.element.id 
                                    else 
                                        i.element.id end) = :elementId
                            )
                            or 
                            (case when 
                                    type(r)=Item then 
                                        i2.element.id 
                                    else 
                                        i.element.id end) = :elementId 
                            )

我已经设法使查询现在可以基于case语句运行,请确保它的处理时间更长,但实际上与第一个实例相同

答案 5 :(得分:0)

我在HQL中遇到了同样的问题,然后解决了以下查询问题

select CONCAT(event.address1,', ', CASE WHEN event.address2 IS NULL THEN '' ELSE concat(event.address2,', ') END, event.city from EventDetail event where event.startDate>=:startDate and event.endDate<=:endDate;

答案 6 :(得分:-1)

这是在条件中使用字符串比较的示例:

SELECT CASE f.type WHEN 'REMOVE'
                   THEN f.previousLocation 
                   ELSE f.currentLocation 
       END 
FROM FileOperation f