2011-07-08 41 views
1

以下是ExecutionHistory类,这值是使用从exectution_history表JPA /休眠从 @Formula取出的属性之一,休眠@Formula是不支持查询包含“CAST()作为INT”功能

@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转换/休眠这样的:

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在t“,但在Hibernate的查询转换过程中,它会放入不必要的表引用并将其作为”CAST()AS executionh0_.int“执行,以便在执行时给予sql语法模糊处理。

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

谢谢。

回答

0

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

3

这是一个古老的问题,但我会发布一个答案。

如果您正在使用SQL Server数据库,则可以在要投射的类型周围添加双引号。 事情是这样的:

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

谢谢!我想补充一点,如果您使用的是XML映射而不是注解,则需要使用简单的引号而不是斜杠,如下所示: