Join fetch: “la requête spécifiée chargement par jointure ouverte, mais le propriétaire de l'extraites de l'association n'était pas présent dans la liste de sélection”
J'ai un code suivant:
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);
}
Il soulève une exception:
org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
Dans le résultat, je wan pour obtenir uniquement les codes.
OriginalL'auteur yons88 | 2012-09-19
Vous devez vous connecter pour publier un commentaire.
join fetch val.classDAO.b
signifie "lors de l'extraction deval
, également à l'extraction de laclassDAO
lié à laval
". Mais votre requête n'est pas extraireval
. Il récupèreval.code
seulement. Si l'extraction n'a pas de sens. Suffit de le retirer, et tout ira bien:Quelques notes, mais:
classDAO.id = ?
signifie que la jointure est en fait une jointure interne (depuis classDAO ne peut pas être null et ont l'ID donné à la même heure)Compte tenu de ce qui précède, la requête peut être réécrite comme
Merci pour votre explication claire sur ce point. J'ai eu le même problème et une réponse simplement résolu le problème avec ma requête. Dans mon cas, j'ai été en utilisant quelque chose comme ceci: "sélectionnez l'une de x adhérer à x.un comme un join fetch x.un.lazyA join fetch x.un.lazyB; "Juste changé:" sélectionnez l'une de x adhérer à x.un comme un join fetch un.lazyA join fetch un.lazyB; " et cela a fonctionné!
OriginalL'auteur JB Nizet