【问题标题】:How can I use the sql case clause in HQL?如何在 HQL 中使用 sql case 子句?
【发布时间】:2010-12-02 22:02:21
【问题描述】:

我真的需要这方面的帮助。

这里是sn-p的代码:

  hSql=" select case 
      when min(start_day_plan) is not NULL then min(start_day_plan)
      else to_date((min(insertDate)) - cast('1 month' as interval),'yyyy-MM-dd' )
      end 
      from Project"

    getHibernateTemplate().find(hSql);

但这会产生以下错误:


java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.CaseNode 
 \-[CASE] CaseNode: 'case'
    +-[WHEN] SqlNode: 'when'
    |  +-[IS_NOT_NULL] UnaryLogicOperatorNode: 'is not null'
    |  |  \-[AGGREGATE] AggregateNode: 'min'
    |  |     \-[IDENT] IdentNode: 'start_day_plan' {originalText=start_day_plan}
    |  \-[AGGREGATE] AggregateNode: 'min'
    |     \-[IDENT] IdentNode: 'start_day_plan' {originalText=start_day_plan}
    \-[ELSE] SqlNode: 'else'
       \-[METHOD_CALL] MethodNode: '('
          +-[METHOD_NAME] IdentNode: 'to_date' {originalText=to_date}
          \-[EXPR_LIST] SqlNode: 'exprList'
             +-[MINUS] BinaryArithmeticOperatorNode: '-' {dataType=org.hibernate.type.DoubleType@bb21ab}
             |  +-[AGGREGATE] AggregateNode: 'min'
             |  |  \-[IDENT] IdentNode: 'insertDate' {originalText=insertDate}
             |  \-[METHOD_CALL] MethodNode: '('
             |     +-[METHOD_NAME] IdentNode: 'cast' {originalText=cast}
             |     \-[EXPR_LIST] SqlNode: 'exprList'
             |        +-[QUOTED_STRING] LiteralNode: ''1 month''
             |        \-[IDENT] IdentNode: 'interval' {originalText=interval}
             \-[QUOTED_STRING] LiteralNode: ''yyyy-MM-dd''

对此的正确查询是什么?我只是想从插入日期中减去 1 个月。

如果你能帮忙,请帮忙..谢谢:)

【问题讨论】:

    标签: java hibernate persistence hql case


    【解决方案1】:

    我相信您忘记了要查询的表。

         select 
           case 
             when min(start_day_plan) is not NULL then min(start_day_plan) 
             else to_date((min(insertDate)) - cast('1 month' as interval),'yyyy-MM-dd' ) 
           end
         from MyTable
    

    【讨论】:

    • ooppss...我只是忘了在这里粘贴... :)
    • 我需要为此导入类还是 hql 不支持这种情况?
    • case 在 hql 中完美支持(如果底层数据库支持的话)。
    • 但是这个 No data type for node: org.hibernate.hql.ast.tree.CaseNode 到底是什么?代码有什么问题?
    • @side_dish 我不确定。我建议你尝试提出最简单的要求来工作,然后一点一点地增加复杂性,直到遇到错误。然后,要么找到更正,要么用最简单的错误案例向我们提出更集中的问题,说明什么有效,什么无效......
    【解决方案2】:

    我最近偶然发现了同样的问题。我的错误来自 JPA 期望实体类中的查询 AND 中的字段名称相同。

    
    @Entity
    public class Foo {
      private String field1;
      ...
    }
    

    在查询中 field1 是预期的,而不是 Field1FIELD1 等等......

    【讨论】:

      【解决方案3】:

      我遇到了与Stephan 类似的问题和解决方案。我们在 getter 上使用 JPA 注释,但字段名称以大写字母开头(无论如何这不是一个好习惯)。

      private Timestamp MyTime;
      ...
      @Column(name = "MYTIME")
      public Timestamp getMyTime() {
          return MyTime;
      }
      

      我认为当 Hibernate 基于 getter 解析我的字段名称时,它正在寻找一个名为 myTime 的字段,但只有 MyTime。当我使用正确的驼峰式大小写约定 (myTime) 重命名该字段时,问题就解决了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2017-01-27
        相关资源
        最近更新 更多