gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:50:41 24 4
gpt4 key购买 nike

因此,我通过 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com