hibernate 在HQL SELECT中使用CASE语句

nmpmafwu  于 2022-11-14  发布在  其他
关注(0)|答案(7)|浏览(215)

在HQL中有没有办法做到以下几点:

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

fxnxkyjh1#

我猜您可以(3.6,4.3)[内联编辑]...用于WHERE子句:
“简单”大小写case ... when ... then ... else ... end和“搜索”大小写case when ... then ... else ... end

hec6srdp

hec6srdp2#

显然,added in 3.0.4能够做到这一点,但限制是不能在Else子句中使用子选择。

s71maibg

s71maibg3#

请参阅休眠-论坛:https://forum.hibernate.org/viewtopic.php?t=942197
来自团队的回答(Gavin):WHERE子句支持CASE,但HB3的SELECT子句不支持CASE。
并在独立共和军中看到国家为“未解决”。

neekobn8

neekobn84#

下面您可以找到一个正在运行的查询(在PostgreSQL上使用Hibernate),它使用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
9lowa7mx

9lowa7mx5#

我在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;
wbrvyc0a

wbrvyc0a6#

我们广泛使用Hibernate HQL查询,我认为最终有一种黑客方式来做这样的事情:
假设我们最初有一个查询
i2.element.id = :someId
然后决定将其扩展为如下所示:
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
但有一个问题是,我们希望它只根据类类型来查找它,因此使用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

但这实际上并没有做我们需要它做的事情,我们希望它执行上面的查询,因此知道您可以在WHERE中的WHERE位的CASE语句的末尾赋值一个变量:

(
                            (
                                (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语句工作,当然它要冗长得多,但实际上与第一个示例相同

f0brbegy

f0brbegy7#

以下是在以下条件下使用字符串比较的示例:

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

相关问题