在休眠中通过id有效地加载多个实体

问题描述 投票:14回答:4

所以,我通过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,...

java hibernate entity query-performance identifier
4个回答
10
投票

您要在这里做的是让Hibernate为您的条件做特殊情况处理,这是很多问题。


1
投票

如果知道ID存在,则可以使用load(..)创建代理,而无需实际访问数据库:


0
投票

休眠第二级缓存与休眠查询缓存之间存在差异。以下链接对此进行了很好的解释:http://www.javalobby.org/java/forums/t48846.html


0
投票

您可以做的另一件事是对ID列表进行排序,并标识连续ID的子序列,然后在单个查询中查询这些子序列中的每个子序列。例如,给定List<Long> ids,请执行以下操作(假设您在Java中具有Pair类):

© www.soinside.com 2019 - 2024. All rights reserved.