9

我有以下代码:

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

结果我想只得到代码。

4

1 回答 1

25

join fetch val.classDAO.b意思是“在获取时val,也获取classDAO链接到的val”。但是您的查询不 fetch 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
于 2012-09-19T14:47:49.583 回答