【问题标题】:Using a CASE statement in HQL select在 HQL 选择中使用 CASE 语句
【发布时间】:2009-01-19 00:10:34
【问题描述】:

有没有办法在 HQL 中执行以下操作:

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

【问题讨论】:

标签: nhibernate hibernate hql


【解决方案1】:

我猜你可以(3.6,4.3[内联编辑] ...对于 where 子句:

“简单”案例case ... when ... then ... else ... end 和“搜索”案例case when ... then ... else ... end

【讨论】:

  • 感谢您的回复...不幸的是,这是针对 where 子句而不是 select 语句。
【解决方案2】:

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

【讨论】:

  • 感谢您的帖子。不幸的是,这仅适用于 Hibernate 而不是 NHibernate ......但希望它在 Hibernate 中它在 NHibernate 之前不应该太远
【解决方案3】:

查看 Hibernate 论坛:https://forum.hibernate.org/viewtopic.php?t=942197

团队 (Gavin) 的回答: 在where子句中支持case,但在HB3中的select子句中不支持。

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

【讨论】:

【解决方案4】:

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

SELECT CASE ps.open WHEN true THEN 'OPEN' else 'CLOSED' END, CASE ps.full WHEN true THEN 'FULL' else “免费”结束,ps.availableCapacity FROM ParkingState as ps

【讨论】:

  • 在 MSSQL 上这不能正常工作。我不得不使用'1'而不是'true'。 : "SELECT CASE ps.open WHEN 1 THEN 'OPEN' else 'CLOSED' END"
【解决方案5】:

我在 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】:

    我们广泛使用休眠 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 语句工作,确保它更加冗长但实际上与第一个实例相同

    【讨论】:

      【解决方案7】:

      这是一个在条件中使用字符串比较的例子:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        相关资源
        最近更新 更多