Hibernate API des Critères de Filtrage collection de propriété
J'ai une telle entité:
@Entity
public class Album {
private Integer id;
private Integer ownerId;
private String name;
private String description;
private Date created;
@OneToMany @JoinColumn(name = "albumId")
private Set<AlbumUser> users = new HashSet<AlbumUser>();
@OneToMany @JoinColumn(name = "albumId")
private Set<Picture> pictures = new HashSet<Picture>();
}
et un autre:
@Entity
public class Picture {
private Integer id;
private Integer creatorId;
private Integer albumId;
private Date created;
private String title;
private String description;
@ManyToOne @JoinColumn(name = "eventId")
private Event event;
}
À l'aide des Critères de l'API je veux obtenir unique AlbumDs avec un ensemble filtré de Picturs. J'ai essayer quelque chose comme cela:
public Album read(Integer albumId, Set<Integer> picFilter) {
Criteria crit = getCurrentSession().createCriteria(Album.class, "album");
crit.add(Restrictions.idEq(albumId));
if (picFilter != null && !picFilter.isEmpty()) {
crit = crit.createAlias("album.pictures", "picture");
crit.add(Restrictions.in("picture.event.id", picFilter));
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
}
Album resultDs = (Album) crit.uniqueResult();
return resultDs;
}
Et ici, je reçois l'Album avec toutes les photos associées. Ils ne sont pas filtrés.
Lorsque j'essaie d'exécuter la requête imprimée par un enregistreur, je reçois seulement quatre lignes qui est le nombre de photos avec id de l'événement, mais dans l'Album de toutes les photos.
J'ai aussi essayé d'autres ResultTransformers, mais finalement obtenu beaucoup de résultat (4) ne se distingue pas de l'un.
Ce qui me manque ou de faire le mal?
Pardonne-moi mes cassé la langue 😉
avez-vous essayé de regarder ce de requête sql, hibernate génère?
Je l'ai écrit déjà. Il y a une requête SQL de la récupération de seulement 4 photos, mais j'ai trouvé plus tard, il y a aussi une autre récupération de la totalité d'entre eux. Je commence à croire que mon cas n'est pas applicable aux Critères de l'API 🙁
Je suis venu à une conclusion. Filtrage de la collection associée avec l'entité est dangereux. Il y aura une mise à jour lors de la transaction de sortie. Donc par définition, quelques photos seront retirées de l'album. C'est un mauvais comportement. Alors... collection doit être en lecture seule (pas de pénétration ni actualisable) ou cette affaire pourrait ne pas être mis en œuvre pour des raisons de sécurité. Unfortunetlny, actuellement je n'ai pas mon code maintenant et ne peux pas le vérifier.
avez-vous essayé de regarder ce de requête sql, hibernate génère?
Je l'ai écrit déjà. Il y a une requête SQL de la récupération de seulement 4 photos, mais j'ai trouvé plus tard, il y a aussi une autre récupération de la totalité d'entre eux. Je commence à croire que mon cas n'est pas applicable aux Critères de l'API 🙁
Je suis venu à une conclusion. Filtrage de la collection associée avec l'entité est dangereux. Il y aura une mise à jour lors de la transaction de sortie. Donc par définition, quelques photos seront retirées de l'album. C'est un mauvais comportement. Alors... collection doit être en lecture seule (pas de pénétration ni actualisable) ou cette affaire pourrait ne pas être mis en œuvre pour des raisons de sécurité. Unfortunetlny, actuellement je n'ai pas mon code maintenant et ne peux pas le vérifier.
OriginalL'auteur Patryk Dobrowolski | 2011-05-23
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas filtrer le contenu des Collections associées à une entité, y compris les Restrictions sur la Collecte dans la requête. La requête va seulement chercher les Albums. Le contenu de la Collection peuvent être récupérés plus tard, lorsque la Collection est accessible. Tout ce que vous faites, c'est de filtrer les Albums pour extraire uniquement les Albums qui contiennent de l'image avec l'id d'événement.
Si la Collection ne comporte que les Images qui correspondent à vos Critères et vous obtiendrez une Collection partielle, il serait à l'origine de problèmes de mises à jour, parce que Hibernate ensuite, pense que les éléments filtrés ont été supprimées, et permettrait de mettre à jour la base de données pour refléter ce changement, supprimer les éléments de la Collection.
Si vous souhaitez ne recevoir que certains éléments d'une Collection, vous pouvez utiliser le Session.createFilter() méthode. Le seul problème, c'est qu'elle prend uniquement en charge les requêtes HQL actuellement.
OriginalL'auteur Reboot
Je me souviens de cet un problème pour quelque chose que j'ai fait récemment. Avez-vous essayé ceci:
OriginalL'auteur jbrookover
essayez ceci:
OriginalL'auteur sul
Si vous utilisez des alias avec left_join, il sera de retour juste sous-objet qui satisfont la condition liée. Sinon, elle retourne l'objet principal qui remplissent les conditions, mais avec l'ensemble de l'ensemble de l'objet.
Cette méthode est deprrecated dans certains hibernate version, si de sorte que vous pouvez utiliser en dessous de solution pour ça aussi:
critères filtrée ensemble complexe
OriginalL'auteur Mustafa Kemal