Join fetch: “query specified join fetching, but th

2019-05-02 09:42发布

问题:

I have a following code:

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);
}

It raises an exception:

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

In the result I wan to get only codes.

回答1:

join fetch val.classDAO.b means "when fetching val, also fetch the classDAO linked to the val". But your query doesn't fetch val. It fetches val.code only. So the fetch makes no sense. Just remove it, and everything will be fine:

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

Some notes, though:

  • doing a left join and then adding a retriction like classDAO.id = ? means that the join is in fact an inner join (since classDAO can't be null and have the given ID at the same time)
  • naming your entities XxxDAO is very confusing. DAOs and entities are not the same thing at all.

Given the above, the query can be rewritten as

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