Nhibernate 在HQL select中使用CASE语句
在HQL中是否有任何方法可以执行以下操作: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
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”