【发布时间】:2019-10-24 23:48:05
【问题描述】:
我有一个 Song 类,其中包含 CoverArts 的集合
例如
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name = "recNo")
private List<CoverArt> coverArts;
我正在使用 Hibernate 4.3.11 和 DB2 数据库,我有这个查询,用于通过主键和封面艺术检索歌曲列表。
public static List<Song> getSongsWithCoverArtFromDatabase(Session session, List<Integer> ids)
{
try
{
Criteria c = session
.createCriteria(Song.class)
.setFetchMode("coverArts", FetchMode.JOIN)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.add(Restrictions.in("recNo", ids));
List<Song> songs = c.list();
return songs;
}
catch (Exception e)
{
MainWindow.logger.log(Level.SEVERE, "Failed LoadSongToDatabase:" + e.getMessage(), e);
throw new RuntimeException(e);
}
}
请注意,我们在 coverArts 集合上将获取模式设置为 JOIN,并且我们需要设置 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) , 否则,如果我们有一首带有两张封面唱片的歌曲,我们将返回两个 Song 对象。但是当使用 Criteria.DISTINCT_ROOT_ENTITY 时,Hibernate 会正确返回包含两个封面的一首歌曲。
但是,我刚刚尝试做同样的事情,但使用了 StatelessSession。原因是我只是想选择数据来创建报告,但我希望最大限度地提高速度并最大限度地减少内存消耗
public static List<Song> getSongsWithCoverArtFromDatabase(StatelessSession session, List<Integer> ids)
{
try
{
Criteria c = session
.createCriteria(Song.class)
.setFetchMode("coverArts", FetchMode.JOIN)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.add(Restrictions.in("recNo", ids));
List<Song> songs = c.list();
return songs;
}
catch (Exception e)
{
MainWindow.logger.log(Level.SEVERE, "Failed LoadSongToDatabase:" + e.getMessage(), e);
throw new RuntimeException(e);
}
}
这似乎忽略了 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 并返回重复行。
这是一个已知的错误,它的表现如何?
【问题讨论】:
标签: java hibernate hibernate-4.x