Hibernate左连接提取 - 只获取第一个表的ID列表

时间:2011-11-15 15:43:36

标签: java sql oracle hibernate hql

我有以下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吗?

1 个答案:

答案 0 :(得分:0)

更新

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

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

当你添加LEFT时,你隐式使它成为外连接,如果你需要的只是按键加入,则无需初始化账单


Hibernate要求对象在select子句中对其进行任何急切的连接提取

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

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

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