代码之家  ›  专栏  ›  技术社区  ›  lomaxx

在hql select中使用case语句

  •  15
  • lomaxx  · 技术社区  · 17 年前

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

    SELECT 
        case when flag = true then SUM(col1) else SUM(col2)
    FROM 
        myTable
    
    7 回复  |  直到 7 年前
        1
  •  9
  •   Kariem    11 年前

    我想你可以( 3.6 , 4.3 ) [联机编辑] …对于WHERE条款:

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

        2
  •  5
  •   Hilton Campbell    17 年前

    显然,这样做的能力是 added in 3.0.4 ,但限制条件是不能在else子句中使用sub-select。

        3
  •  4
  •   Stephan Prantl    16 年前

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

    团队回答(gavin): WHERE子句支持CASE,而HB3的SELECT子句不支持。

    在吉拉看到,国家“悬而未决”。

        4
  •  3
  •   Ruben    16 年前

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

    选择case ps.open when true,然后 “open”else“closed”结束,case ps.full如果为真,则为“full”,否则为 “自由”端,PS.可用容量 从帕金森病发来的

        5
  •  0
  •   V H    7 年前

    我们广泛使用hibernate 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语句工作,当然它的长度要长得多,但实际上与第一个实例一样。

        6
  •  0
  •   Faiz Akram    7 年前

    我在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;
    
        7
  •  -2
  •   martin    16 年前

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

    选择“移除”时的case f.type 然后是前一个位置 else f.currentLocation结束 从文件操作F