我有一个带有简单长主键的实体。 我做一个查询:从表中选择primary_key IN(....);
Hibernate似乎想要进行查询来获取Ids(我刚才指定的!)然后转到L2缓存。有没有办法跳过初始查询?我只想通过主键实现一组实体。 不确定这是JPA 1还是JPA 2.0(更好地支持Lists)。
我可以在循环中找到findById()并获得所需的结果,但这显然不是最佳的。
答案 0 :(得分:0)
您需要启用query caching和此特定查询作为缓存能力。这仅适用于JPA 2.0中的提示。
query.setHint(“org.hibernate.cacheable”, true);
通过设置以下属性
启用查询缓存hibernate.cache.use_query_cache true
另一种解决方案是在循环中使用getReference并启用批量加载。如果实例存在于缓存中,它将从缓存中返回 - 如果不是在访问第一个代理对象时,它将触发一个查询以加载一批这些。您可以将其隐藏在实用程序功能之后。
public List<T> findMany(Class<T> entityClass,List<? extends Serializable> ids) {
List<T> result = new ArrayList<T>;
for(Serializable id:ids) {
result.add(entityManager.getRefrence(id));
}
for(T entity:result) {
// force initialization of proxies, if batch loading is enabled
// this shouldn't lead to one query per entity
Hibernate.initialize(entity);
}
return result;
}
这可能需要一些调整 - 没有测试过 - 特别是泛型部分。