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|