我有这样的实体:
@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>();
}
另一个:
@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;
}
使用 Criteria API,我想获得带有过滤图片集的独特 AlbumD。我尝试这样的事情:
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;
}
在这里我得到了包含所有相关图片的相册。它们根本没有被过滤。
当我尝试执行记录器打印的查询时,我只得到四行,即具有给定 eventId 的图片数量,但在相册中我得到了所有图片。
我还尝试了其他结果转换器,但最终得到了许多结果(4)而不是不同的结果。
我错过了什么或做错了什么?
您无法通过在查询中包含对集合的限制来过滤与实体关联的集合的内容。该查询只会获取相册。当集合被访问时,可以稍后获取集合的内容。您要做的就是过滤相册以仅检索包含具有事件 ID 的图片的相册。
如果集合仅包含与您的条件匹配的图片,并且您将获得部分集合,则会导致更新问题,因为 Hibernate 会认为过滤的项目已被删除,并会更新数据库以反映该更改,实际上会删除这些项目来自收藏。
如果您只想接收收藏中的某些项目,您可以使用Session.createFilter()方法。唯一的问题是,它目前仅支持 HQL 查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)