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

时间:2012-09-19 14:33:24

标签: java hibernate hql

我有以下代码:

public class ValueDAO  implements BusinessObject<Long> {

    private Long id;
    private String code;
    private ClassDAO classDAO ;
        ....
}

public List<String> 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

在结果中我只想获得代码。

1 个答案:

答案 0 :(得分:21)

join fetch val.classDAO.b表示&#34;在抓取val时,还会抓取与classDAO&#34;相关联的val。但是您的查询并未获取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不能为空并且同时具有给定的ID)
  • 命名您的实体XxxDAO非常混乱。 DAO和实体根本不是一回事。

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

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