有没有办法在HQL中执行以下操作:
SELECT
case when flag = true then SUM(col1) else SUM(col2)
FROM
myTable
答案 0 :(得分:10)
我猜你可以(3.6,4.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