【问题标题】:Hibernate left join fetch - get only an ID list of the first tableHibernate left join fetch - 只获取第一个表的ID列表
【发布时间】:2011-11-15 15:43:36
【问题描述】:

我有以下 HQL 查询,它工作正常,但是它返回一个完整的 FooD 对象列表。我只需要 FooD 对象的 ID,因为我需要更快的查询。请注意,在 Hibernate 映射中,FooD 与 FooB 是多对一的关系。

hqlQuery = "from FooD d left join fetch d.bill where d.ts < :ts"

然后我尝试使用相同类型的 HQL 查询仅获取 ID:

hqlQuery = "SELECT d.id from FooD d left join fetch d.bill where d.ts < :ts"

我收到“查询指定连接提取,但提取关联的所有者不在选择列表中”。

然后我将查询转换为常规 Oracle SQL 以仅获取 FooD.ID:

sqlQuery = "SELECT d.id from FooD d LEFT OUTER JOIN FooB b on d.foodId=b.id where d.ts < :ts"

然后我像这样映射 FooD 和 FooB 对象:

sqlQuery.addEntity(FooD.class);
sqlQuery.addEntity(FooB.class);

然后通过调用得到结果列表:

hSession.createSQLQuery(sql).setTimestamp("ts", ts).list();

但出现以下错误:"unexpected token: on near line 1".

在使用 Hibernate 对 FooB 进行左外连接时,是否有人知道如何仅获取 FooD 的 ID?

【问题讨论】:

  • 如果你只需要b.id,并且where子句有d.ts,为什么还要在同一个查询中初始化d.bill呢?
  • 因为我只需要 d.id 有账单(d.bill 是 FooB.id)。

标签: java sql oracle hibernate hql


【解决方案1】:

更新:

我没有测试它,但这应该可以解决问题

SELECT d.id from FooD d inner join d.bill where d.ts < :ts

当您添加 LEFT 时,您会隐式将其设为外连接,如果您只需要按键连接,则无需初始化 bill


Hibernate 要求对象位于 select 子句中才能对其进行任何急切的连接获取

但既然你在 d.bill 上没有 select 或 where 子句,那你为什么还要获取它呢?

如果你只需要id,为什么不这样做,没有理由冗余连接:

hqlQuery = "SELECT d.id from FooD d where d.ts < :ts" 

【讨论】:

  • 因为我需要获取所有有账单的 FooD(d.bill 是链接到 FooB.id 的外键)。
  • 感谢您的链接!但是我不明白我怎么能用它做左连接。
  • 使用 exists 关键字检查这些 HQL 示例:“from Cat cat where exists elements(cat.kittens)”,但我认为您必须将对象完全包含在我提到的 select 子句中(参见 @ 987654322@更多样品)
  • 如果您尝试删除“fetch”关键字,它是否有效?你不是真的想初始化它,你只是想加入(inner join)
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多