加入fetch:“查询指定的连接提取,但获取的关联的所有者在选择列表中不存在”

我有以下代码:

public class ValueDAO implements BusinessObject { private Long id; private String code; private ClassDAO classDAO ; .... } public List getCodesByCodeClass(Long classId) { String select = "select distinct val.code from ValueDAO val left " + "join fetch val.classDAO "; String where = "where val.classDAO.id = ? order by val.code"; return getHibernateTemplate().find(select + where, classId); } 

它引发了一个例外:

  org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 

结果我想得到的只是代码。

join fetch val.classDAO.b意思是“在获取val ,也获取链接到valclassDAO ”。 但是你的查询不能获取val 。 它仅获取val.code 。 所以抓取没有任何意义。 只需删除它,一切都会好起来的:

 select distinct val.code from ValueDAO val left join val.classDAO classDAO where classDAO.id = ? order by val.code 

但有些说明:

  • 做左连接,然后添加像classDAO.id = ? 表示连接实际上是一个内连接(因为classDAO不能为null并且同时具有给定的ID)
  • 命名你的实体XxxDAO非常混乱。 DAO和实体根本不是一回事。

鉴于上述情况,可以将查询重写为

 select distinct val.code from ValueDAO val where val.classDAO.id = ? order by val.code