java - 在 Hibernate 中通过 id 有效加载多个实体

标签 java hibernate entity query-performance identifier

因此,我通过 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();

但是,如果我启用二级缓存并不意味着我的旧方法将能够从二级缓存中返回对象(如果它们之前被请求过),但我的查询将始终转到数据库。

这样做的正确方法是什么?

最佳答案

你在这里要求做的是让 Hibernate 为你的 Criteria 做特殊的案例处理,这有点多。

你必须自己做,但这并不难。使用 SessionFactory.getCache() ,您可以获得对缓存对象实际存储的引用。执行以下操作:

for (Long id : allRequiredIds) {
  if (!sessionFactory.getCache().containsEntity(Song.class, id)) {
    idsToQueryDatabaseFor.add(id)
  } else {
    songs.add(session.get(Song.class, id));
  }
}

List<Song> fetchedSongs = session.createCriteria(Song.class).add(Restrictions.in("id",idsToQueryDatabaseFor).list();
songs.addAll(fetchedSongs);

然后从缓存中检索歌曲,从那里检索歌曲,而没有用单个 select 拉取的歌曲。 .

关于java - 在 Hibernate 中通过 id 有效加载多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418181/

相关文章:

java - 如何重写sql语句以与hibernate一起工作?

java - Hibernate 和可序列化实体

frameworks - 如何在 VS 2012 EF 模型中创建自定义部分类

Java 8 : Input a list of functional Interfaces and call them dynamically after . 流()

java - 从 xml 文档中删除具有无效标签名称的节点

hibernate - Grails dbCreate = update总是创建现有的联接表

sql - 为什么 Entity Framework 生成的查询运行时间是直接运行相同查询的两倍?

java - Java 中的工作线程

java - Tomcat 如何处理 keystore 中的多个 SSL 证书?

java - 尝试同时保存到两个数据库时,找不到当前线程的 session 错误