Using a CASE statement in HQL select

后端 未结 7 614
再見小時候
再見小時候 2020-12-10 01:51

Is there any way to do the following in HQL:

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable
7条回答
  •  不知归路
    2020-12-10 02:12

    We use hibernate HQL query extensively and I think finally there is a hackish way of doing such a thing :

    Assuming we originally had a query of

    i2.element.id = :someId

    Then decided to expand this to be something like this:

    ((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))

    But there was an issue where we want it to only lookup for this based on classType so a case statement:

    (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)
    

    Above will not work you could make an easy version of above work by doing:

    (case when type(i)=Item then 
    i2.element.id
    else
    i.element.id
    end)=:elementId
    

    But this does not actually do what we need it to do, we want it to do exact above query, so knowing you can assign a variable at the end of a case statement in there where bit of 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 
                                )
    

    I have managed to make the query now work based on case statement, sure it is a lot more long winded but actually does the same as the first instance

提交回复
热议问题