关于连接的hibernate额外子句

时间:2014-08-19 11:30:29

标签: mysql hibernate spring-mvc

很久以前,我使用servlets和jsps在java中构建了一个Web应用程序,现在,我想使用框架spring和hibernate重新创建它。

但是,我在使用hibernate时遇到一些困难,需要使用特殊子句进行包含“连接”的查询,我会有2个问题。

我给你一个虚构的例子,让我们想象一个拉力赛结果应用程序:

首先想象3个表:

  • 种族(身份证,姓名)

  • driver(id,name)

  • 结果(id_race,id_driver,final_position)

实体竞赛与实体竞赛有很多关联,并且有一套驱动程序。

现在,我想在hql中创建一个返回与此sql查询返回的结果相同结果的查询:

select ra.*,d.name from race as ra left outer join result as re on re.id_race=ra.id and re.final_pos=1  inner join driver as d on d.id=re.id_driver

第一个问题,在hql中,如何在我的连接中添加此特定子句(final_pos = 1)?

我已经阅读了关键字“with”,但它不适用于fetch,我需要急切加载此信息。

然后,我尝试了“过滤器”注释,这是有效的。但实际上并非完全......

如果我查询实体Race,我会得到(如果他已经存在)比赛的获胜者

但是现在,如果我添加另一个表,例如,表“rally_stage”(id,name,id_race)。比赛包含几个阶段,一个阶段与一个且仅一个种族相关联。

如果现在,我查询实体RallyStage,过滤器被忽略,查询返回参加比赛的所有车手(而不仅仅是获胜者)

我知道我需要在我的代码中启用过滤器并且我这样做,但是当我查询Entity Race(包含过滤器)时你知道它为什么有用吗?但是当我查询它时为什么它不起作用实体RallyStage只链接到一个种族。

您是否认为可能会使用不同的“休眠会话”来返回我的结果(RallyStage,Race和获胜者),因此,过滤器不适用于所有这些不同的会话。

如果是这样的话,我怎么能解决它,因为我让司机只是在调用我的实体竞赛的属性“司机”。

第二个问题:我确信只有一名比赛获胜者(如果比赛尚未参加比赛,则根本没有获胜者),我想对结果进行排序司机名。

sql示例:

select ra.*,d.name from race as ra left outer join result as re on re.id_race=ra.id and re.final_pos=1  inner join driver as d on d.id=re.id_driver order by d.name

由于驱动程序是实体竞赛中的一个Set,所以我无法对此属性进行排序。注释@orderby允许对实体“Race”中包含的集进行排序,但它不对种族列表进行排序。 (这就是我想要做的)。

有什么想法吗?

如果你能帮我解决这两个让我疯狂的问题,我真的很感激。

我希望我的解释不会太多,我为我的近似英语道歉。

提前感谢。

1 个答案:

答案 0 :(得分:0)

第一个问题:

为什么不将第二个条件移动到像这样的where子句

select ra.*,d.name 
from race as ra 
left outer join result as re on re.id_race=ra.id 
inner join driver as d on d.id=re.id_driver
where re.final_pos=1

这可以在HQL中完成,如果这不适合你,你也可以像这个例子一样尝试Theta连接:How to join two unrelated entities using Hibernate

第二个问题:

在这里,您可以创建一个不同的HQL查询,该查询将检索已按驱动程序名称排序的列表。或者使用你得到的那个集合并直接用Java对它进行排序。

相关问题