有没有办法在 HQL 中执行以下操作:
SELECT
case when flag = true then SUM(col1) else SUM(col2)
FROM
myTable
有没有办法在 HQL 中执行以下操作:
SELECT
case when flag = true then SUM(col1) else SUM(col2)
FROM
myTable
显然,在 3.0.4 中添加了执行此操作的功能,但限制是您不能在 else 子句中使用子选择。
参见 Hibernate 论坛:https ://forum.hibernate.org/viewtopic.php?t=942197
Team (Gavin) 的回答:where 子句支持 case,但 HB3 中的 select 子句不支持 case。
并在 JIRA 中看到状态为“未解决”。
您可以在下面找到一个工作查询(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
我在 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;
我们广泛使用休眠 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 语句工作,确保它更加冗长但实际上与第一个实例相同
这是在条件中使用字符串比较的示例:
SELECT CASE f.type WHEN 'REMOVE'
THEN f.previousLocation
ELSE f.currentLocation
END
FROM FileOperation f