Hibernate JPQL/HQL:aggregate函数出现错误,显示两次连接的错误表/实体的结果(仅使用HSQLDB)?
我有以下表格:Hibernate JPQL/HQL:aggregate函数出现错误,显示两次连接的错误表/实体的结果(仅使用HSQLDB)?,hibernate,code-generation,aggregate-functions,hsqldb,jpql,Hibernate,Code Generation,Aggregate Functions,Hsqldb,Jpql,我有以下表格: CREATE TABLE Rosters ( id INTEGER NOT NULL, club_abbr VARCHAR(10) NOT NULL, ordinal_nbr SMALLINT, PRIMARY KEY (id) ); CREATE TABLE Games ( id INTEGER NOT NULL, scheduled_tipoff DATETIME NOT NULL, PRIMARY KEY (id) ); -- join ta
CREATE TABLE Rosters
(
id INTEGER NOT NULL,
club_abbr VARCHAR(10) NOT NULL,
ordinal_nbr SMALLINT,
PRIMARY KEY (id)
);
CREATE TABLE Games
(
id INTEGER NOT NULL,
scheduled_tipoff DATETIME NOT NULL,
PRIMARY KEY (id)
);
-- join table
CREATE TABLE Scores
(
game_id INTEGER NOT NULL,
is_home BOOLEAN NOT NULL,
roster_id INTEGER NOT NULL,
final_score SMALLINT DEFAULT NULL NULL,
PRIMARY KEY (game_id, is_home),
FOREIGN KEY (game_id) REFERENCES Games (id),
FOREIGN KEY (roster_id) REFERENCES Rosters (id)
);
简单的逻辑是,一场比赛有两个分数,主场和客场(PK中是主场),这两个分数与花名册ID关联。分数表基本上是比赛和花名册之间的连接表。我相应地映射了类(这里没有问题):
下面是我下一步要汇总的数据(14场比赛,28分,[sf]的14分,[sa]的14分,以及2场未播放的比赛):
对的分数之和是856,对的分数之和是881。12人玩游戏。的平均分为71.33333,对的平均分为71.4166666
我使用的是JPQL语句:
SELECT NEW tld.jpqlsum.view.StringLine(
SUM(sf.finalScore)
, SUM(sa.finalScore)
, AVG(sf.finalScore)
, AVG(sa.finalScore)
, MIN(sf.finalScore)
, MIN(sa.finalScore)
, MAX(sf.finalScore)
, MAX(sa.finalScore)
)
FROM Game ga
JOIN ga.scores sf
JOIN ga.scores sa
WHERE ga.id <> 57 AND sf.roster.id = 1 AND sa.roster.id <> 1
GROUP BY sf.roster.id
然后,我尝试了MySQL和相应的MySQLquantial,它们生成完全相同的代码,只是AVG函数强制转换为double:
select
sum(scores1_.final_score) as col_0_0_,
sum(scores2_.final_score) as col_1_0_,
avg(scores1_.final_score) as col_2_0_,
avg(scores2_.final_score) as col_3_0_,
min(scores1_.final_score) as col_4_0_,
min(scores2_.final_score) as col_5_0_,
max(scores1_.final_score) as col_6_0_,
max(scores2_.final_score) as col_7_0_
from
Games game0_
inner join
Scores scores1_
on game0_.id=scores1_.game_id
inner join
Scores scores2_
on game0_.id=scores2_.game_id
where
game0_.id<>57
and scores1_.roster_id=1
and scores2_.roster_id<>1
group by
scores1_.roster_id
在我看来,这是一个bug,但仅在HSQLDB中,这很奇怪。这里有什么问题?Hibernate的哪个组件可能导致此问题?我的意思是,MySQL和HSQLDB代码只在AVG函数中有所不同,其中在HSQLDB上生成了一个cast(…as double),但这会不会弄乱结果集,如图所示
这是一个SSCCE(JavaSE、Hibernate、HSQLDB、Ant):
只需在shell中键入“ant run”
如果您也有MySQL,xml/persistence.xml包含MySQL的注释外代码,因此您可以轻松地切换DBMS。还可以查看DB dir,它包含一个设计PDF和ISO/ANSI DDL以及INSERT脚本
注意,我还测试了带方言和不带方言的HSQLDB,以及带方言和不带方言的MySQL(在persistence.xml中设置)。带和不带都显示相同的结果,HSQLDB显示错误,MySQL显示正确
有人能确认这个错误吗?然后我会提交一份bug报告
卡斯滕HSQLDB中有一个bug,它从同一个表的两个版本为同一列生成了相同的聚合结果。这已在最新的2.0.1 JAR中修复
select
sum(scores1_.final_score) as col_0_0_,
sum(scores2_.final_score) as col_1_0_,
avg(cast(scores1_.final_score as double)) as col_2_0_,
avg(cast(scores2_.final_score as double)) as col_3_0_,
min(scores1_.final_score) as col_4_0_,
min(scores2_.final_score) as col_5_0_,
max(scores1_.final_score) as col_6_0_,
max(scores2_.final_score) as col_7_0_
from
Games game0_
inner join
Scores scores1_
on game0_.id=scores1_.game_id
inner join
Scores scores2_
on game0_.id=scores2_.game_id
where
game0_.id<>57
and scores1_.roster_id=1
and scores2_.roster_id<>1
group by
scores1_.roster_id
|SUM(sf.finalScore)|SUM(sa.finalScore)|AVG(sf.finalScore)|AVG(sa.finalScore)|MIN(sf.finalScore)|MIN(sa.finalScore)|MAX(sf.finalScore)|MAX(sa.finalScore)|
|------------------|------------------|------------------|------------------|------------------|------------------|------------------|------------------|
| 856| 856| 71.33333333333333| 71.33333333333333| 50| 50| 89| 89|
select
sum(scores1_.final_score) as col_0_0_,
sum(scores2_.final_score) as col_1_0_,
avg(scores1_.final_score) as col_2_0_,
avg(scores2_.final_score) as col_3_0_,
min(scores1_.final_score) as col_4_0_,
min(scores2_.final_score) as col_5_0_,
max(scores1_.final_score) as col_6_0_,
max(scores2_.final_score) as col_7_0_
from
Games game0_
inner join
Scores scores1_
on game0_.id=scores1_.game_id
inner join
Scores scores2_
on game0_.id=scores2_.game_id
where
game0_.id<>57
and scores1_.roster_id=1
and scores2_.roster_id<>1
group by
scores1_.roster_id
|SUM(sf.finalScore)|SUM(sa.finalScore)|AVG(sf.finalScore)|AVG(sa.finalScore)|MIN(sf.finalScore)|MIN(sa.finalScore)|MAX(sf.finalScore)|MAX(sa.finalScore)|
|------------------|------------------|------------------|------------------|------------------|------------------|------------------|------------------|
| 856| 881| 71.3333| 73.4167| 50| 43| 89| 101|