19

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

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

7 回答 7

12

我想你可以(3.64.3[内联编辑] ...对于 where 子句:

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

于 2009-01-19T00:19:01.763 回答
6

显然,在 3.0.4 中添加了执行此操作的功能,但限制是您不能在 else 子句中使用子选择。

于 2009-01-19T12:11:51.140 回答
6

参见 Hibernate 论坛:https ://forum.hibernate.org/viewtopic.php?t=942197

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

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

于 2010-01-15T09:41:39.537 回答
4

您可以在下面找到一个工作查询(postgresql 上的休眠),它使用 2 个 case 语句将布尔值替换为相应的文本表示。

SELECT CASE ps.open WHEN true THEN 'OPEN' else 'CLOSED' END, CASE ps.full WHEN true THEN 'FULL' else 'FREE' END, ps.availableCapacity FROM ParkingState as ps

于 2009-02-12T12:44:28.283 回答
1

我在 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;
于 2018-12-27T08:38:48.367 回答
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 语句工作,确保它更加冗长但实际上与第一个实例相同

于 2018-07-06T10:54:27.887 回答
-2

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

SELECT CASE f.type WHEN 'REMOVE'
                   THEN f.previousLocation 
                   ELSE f.currentLocation 
       END 
FROM FileOperation f
于 2009-06-10T15:06:43.360 回答