Nhibernate 在HQL select中使用CASE语句

Nhibernate 在HQL select中使用CASE语句,nhibernate,hibernate,hql,Nhibernate,Hibernate,Hql,在HQL中是否有任何方法可以执行以下操作: SELECT case when flag = true then SUM(col1) else SUM(col2) FROM myTable 我想您可以(,)[inline edit]…针对where子句: “简单”案例,案例。。。什么时候然后。。。其他的结束,并“搜索”案例,案例在。。。然后。。。其他的结束 显然,这样做的能力是,有一个限制,即不能在else子句中使用子选择。下面可以找到一个工作查询(postgresql上的h

在HQL中是否有任何方法可以执行以下操作:

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable
我想您可以(,)[inline edit]…针对where子句:

“简单”案例,
案例。。。什么时候然后。。。其他的结束
,并“搜索”案例,
案例在。。。然后。。。其他的结束


显然,这样做的能力是,有一个限制,即不能在else子句中使用子选择。

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

选择CASE ps.open当为true时,则 “打开”或“关闭”结束,案例 ps.full如果为真,则为“full”,否则为 “自由”端,ps.availableCapacity 从ParkingState作为ps


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

SELECT CASE f.type WHEN 'REMOVE'
                   THEN f.previousLocation 
                   ELSE f.currentLocation 
       END 
FROM FileOperation f
请参阅Hibernate论坛:

团队(加文)的回答: where子句支持大小写,但HB3中的select子句不支持大小写


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

我们广泛使用hibernate HQL查询,我认为最终有一种黑客方式可以完成这样的事情:

假设我们最初有一个关于

i2.element.id=:someId

然后决定将其扩展为如下内容:

((i.element.id=:someId和i2.element.id=:someId)或(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
但这实际上并不能完成我们需要它做的事情,我们希望它能完成上面的查询,所以知道您可以在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语句工作,当然它要冗长得多,但实际上与第一个实例相同

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

选择CONCAT(event.address1',,',如果event.address2为空,则选择“ELSE CONCAT(event.address2',,”)END,event.city from EventDetail event where event.startDate>=:startDate和event.enddate感谢您的回复…不幸的是,这是where子句,而不是select语句。感谢您的帖子。不幸的是,这只适用于Hibernate,而不是NHibernate…但希望在Hibernate中,它在运行之前不会太远在NHibernate中,您查看了哪一个JIRA问题?我找到了,它已针对3.0.4进行了修复。是的,案例现在在HQL中工作(我使用的是3.5.5),但在MSSQL上无法正常工作。我必须使用“1”而不是“true”。:“选择案例ps.open WHEN 1,然后选择“open”,否则选择“CLOSED”END”