所以,我通过ID得到了一个特定实体的许多实例:
for(Integer songId:songGroup.getSongIds()) {
session = HibernateUtil.getSession();
Song song = (Song) session.get(Song.class,id);
processSong(song);
}
这会为每个ID生成一个SQL查询,因此我想到应该一次完成,但是除了运行查询之外,我无法找到一种在一次调用中获取多个实体的方法。所以我写了一个查询
return (List) session.createCriteria(Song.class)
.add(Restrictions.in("id",ids)).list();
但是,如果启用了第二级缓存,并不意味着我的旧方法将能够从第二级缓存中返回对象(如果以前曾请求过这些对象,但是我的查询将始终进入数据库。) >
正确的方法是什么?
因此,我通过id获取特定实体的许多实例:for(Integer songId:songGroup.getSongIds()){session = HibernateUtil.getSession(); Song song =(Song)session.get(Song.class,...
您要在这里做的是让Hibernate为您的条件做特殊情况处理,这是很多问题。
如果知道ID存在,则可以使用load(..)创建代理,而无需实际访问数据库:
休眠第二级缓存与休眠查询缓存之间存在差异。以下链接对此进行了很好的解释:http://www.javalobby.org/java/forums/t48846.html
您可以做的另一件事是对ID列表进行排序,并标识连续ID的子序列,然后在单个查询中查询这些子序列中的每个子序列。例如,给定List<Long> ids
,请执行以下操作(假设您在Java中具有Pair类):