【发布时间】:2011-08-31 10:09:43
【问题描述】:
我有这样的实体:
@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 的图片数量,但在相册中我得到所有图片。
我也尝试了其他的 ResultTransformer,但最终得到了很多结果 (4) 不明显。
我错过了什么或做错了什么?
【问题讨论】:
-
原谅我的语言不通;)
-
你有没有尝试观察hibernate生成的sql查询?
-
我已经写好了。有一个 SQL 查询只检索到 4 张图片,但后来我发现,还有另一个检索所有照片。我开始相信我的案例无法使用 Criteria API 实现:(
-
我得出了一些结论。过滤与实体关联的集合是不安全的。交易退出期间会有更新。所以根据定义,一些图片将从相册中删除。这是错误的行为。所以...集合应该是只读的(不能插入也不能更新),否则由于安全原因,这种情况无法实现。不幸的是,目前我没有我的代码,无法检查它。
标签: java hibernate filtering criteria one-to-many