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もフェッチする」という意味です。ただし、クエリはをフェッチしません。フェッチのみ。したがって、フェッチは意味がありません。それを削除するだけで、すべてがうまくいきます:classDAOvalvalval.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
于 2012-09-19T14:47:49.583 に答える