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