【问题标题】:Using Hibernate Criteria API To Query Many-To-One Relationships with Projections使用 Hibernate Criteria API 查询具有投影的多对一关系
【发布时间】:2010-12-18 11:45:57
【问题描述】:

我正在尝试在以下场景中使用 Criteria API:

  • 我有两个表,ScheduleRoute(以及它们的类和映射)。
  • RouteSchedule 具有多对一关系。
  • Route 有一个整数属性 sequence

现在我需要获取所有关联的 Route 对象满足以下条件的 Schedule 对象:

route.sequence=no. of all Route objects associated with the given Schedule object

我已经尝试了以下标准代码:

Criteria crit = getSession().createCriteria(getPersistentClass())
    .createCriteria("routes", "route")
    .setProjection(Projections.projectionList()
    .add( Projections.rowCount(), "routeCount"))
    .add(Restrictions.not(Restrictions.ltProperty("route.sequence", "routeCount")));

但它会生成以下sql:

select count(*) as y0_ 
from schedule this_
inner join route route1_ on this_.ID=route1_.scheduleId
where route1_.sequence<y0_

并抛出以下错误:

Unknown column 'y0_' in 'where clause'

如果您有任何建议,请帮助我。

【问题讨论】:

  • 我不明白你的伪代码条件。你真的是说所有路由都需要有相同的序列号吗?
  • 一个 Schedule 对象可以有 n 个 Route 对象。 (其中 n 通常为 2 或 3)。 Route.sequence 的取值范围为 0 到 n-1。实际上它是一个简单的航班信息系统的模式。计划表包含航班号、计划日期/时间和航班状态等信息。构成航班路线的城市被放入 Route 表中(因为每个航班可以有可变数量的路线城市)。 Route.sequence 编号标识了一个城市在飞行中所处的顺序。
  • 我一直试图用 Criteria API 弥补的查询是搜索到达给定城市 X 的所有航班。

标签: java hibernate criteria-api


【解决方案1】:

问题源于具有预测和限制的实施问题。尝试对同一列进行投影和限制时似乎存在错误 - 生成的 sql 无效。您会发现,如果直接对您的数据库运行该 sql,它将无法正常工作。

该错误最初记录在 here 并且看起来无法修复。但后来我看到另一个类似的错误记录在here,但我无法确定修复将在哪个版本中可用。

更多关于该问题的讨论及其背后的理论可以在here找到。

还有another stackoverflow item dealing with the same question 并提供解决方案。我没有尝试查看这种方法是否有效,但它似乎对涉及该问题的人有效。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2010-09-20
    • 2013-02-04
    • 2019-10-13
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多