【问题标题】:Hibernate @formula is not supportinng Cast() as int for teradata databaseHibernate @formula 不支持将 Cast() 作为 teradata 数据库的 int
【发布时间】:2014-10-30 01:11:20
【问题描述】:

我正在使用

@Formula("cast(item_code as \"int\")")

String 列转换为int

hibernate 正在生成查询

and cast(this_.item_code as this_."int")=? 

如何去掉int前面的alias

我试过了:

@Formula("cast(item_code as "int")")@Formula("cast(item_code as int)")

但仍然是同样的错误。我如何将 String 转换为 int

提前致谢。

【问题讨论】:

    标签: hibernate formula


    【解决方案1】:

    我已经解决了与您类似的问题。我为我的数据库扩展了休眠方言类。

    public class Oracle10gDialectExtended extends Oracle10gDialect {
    
        public Oracle10gDialectExtended() {
            super();
            /* types for cast: */
            registerKeyword("int");
            // add more reserved words as you need
        }
    }
    

    用这个新类设置“hibernate.dialect”属性。现在你的@Formula 可以工作了。

    【讨论】:

    • 我有@Formula 包含带有listagg(...) within group ... 的子选择并且within 子句有类似的问题,但registerKeyword("within") 不幸的是没有帮助。但是,我最终使用了自己的字符串聚合函数,并没有深入挖掘导致这种 Hibernate 行为的原因。
    • 并以全小写形式注册。浪费了 2 个小时来调试。
    【解决方案2】:

    试试:

    @Formula("cast(item_code as NUMERIC(1,0))")
    

    问题是您使用的方言无法将int 识别为类型(请参阅org.hibernate.dialect.isTypeNameRegistered())。

    您可以根据您的方言使用确切的类型(例如,PostgreSQL 使用 int4,但 DB2、Ingres 和 H2 使用 integer ...)或者您可以使用 NUMERIC(1,0),因为括号后面的所有内容都是由函数或关键字考虑(参见 org.hibernate.sql.Template.isFunctionOrKeyword())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 2016-11-10
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      相关资源
      最近更新 更多