【问题标题】:Hibernate @Formula is not supporting query contains 'CAST() as int' functionHibernate @Formula 不支持查询包含 'CAST() as int' 函数
【发布时间】:2011-07-08 09:37:44
【问题描述】:

以下是 ExecutionHistory 类的属性之一,取值自 @Formula 使用 execution_history 表中的 JPA/Hibernate,

@Formula("(SELECT SUM(dividend) || '/' || SUM(divisor) " +
"FROM (SELECT CAST(substr(sr.result, 1, position('/' in sr.result)-1 ) AS int) AS dividend ," +
"CAST(substr(sr.result, position('/' in sr.result)+1 ) AS int) AS divisor " +
"FROM suite_results as sr WHERE sr.execution_history=id) AS division)")
private String result;

当我试图获取 ExecutionHistory 类的实例时,我发现上面的公式查询 由 JPA/Hibernate 转换如下:

select executionh0_.id as id7_1_, executionh0_.execution_plan as execution3_7_1_, executionh0_.start_time as start2_7_1_, 
(SELECT SUM(sr.duration) FROM suite_results as sr WHERE sr.execution_history=executionh0_.id) as formula0_1_, 
(SELECT SUM(executionh0_.dividend) || '/' || SUM(executionh0_.divisor) FROM 
(SELECT CAST(substr(sr.result, 1, position('/' in sr.result)-1 ) AS executionh0_.int) AS executionh0_.dividend , 
CAST(substr(sr.result, position('/' in sr.result)+1 ) AS executionh0_.int) AS executionh0_.divisor 
FROM suite_results as sr WHERE sr.execution_history=executionh0_.id) AS executionh0_.division) as 
formula1_1_, executionp1_.id as id6_0_, executionp1_.build_number as 
build2_6_0_, executionp1_.name as name6_0_, executionp1_.owner as owner6_0_, executionp1_.sut as sut6_0_, 
executionp1_.wait_for_page_to_load as wait6_6_0_ from execution_history executionh0_ 
left outer join execution_plans executionp1_ on executionh0_.execution_plan=executionp1_.id where executionh0_.id=?

所以问题是,这里的公式查询包含“CAST() AS int”,但是在Hibernate的查询转换过程中,它放置了不必要的表引用并将其作为“CAST() AS executionh0_.int”执行,所以它给出了sql执行时语法异常。

我不知道如何避免这个问题,有人可以帮助我吗?

谢谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    这是一个老问题,但无论如何我都会发布一个答案。

    如果您使用的是 SQL Server 数据库,则可以在要转换的类型周围添加双引号。 像这样的:

    @Formula("CAST(FLOOR(CAST( dat_criacao AS \"float\")) AS \"datetime\")")
    

    【讨论】:

    • 谢谢!我想补充一点,如果您使用 XML 映射而不是 Annotations,则需要使用简单的引号且没有斜杠,如下所示:
    【解决方案2】:

    不知道您使用的是哪个数据库,但在 SQL Server 中,您应该在 Hibernate 查询中使用 CONVERT 而不是 CAST。

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2018-12-07
      • 1970-01-01
      • 2016-01-26
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      相关资源
      最近更新 更多