我有一个带有简单长主键的实体。我做了一个查询,例如:从表中选择 primary_key IN (....);
Hibernate 似乎想要进行查询以获取 Id(我刚刚指定!),然后转到 L2 缓存。有没有办法跳过初始查询?我只想要一组按主键的实体。不确定这是 JPA 1 还是 JPA 2.0(更好地支持列表)。
我可以在循环中执行 findById() 并获得所需的结果,但这显然不是最佳的。
我有一个带有简单长主键的实体。我做了一个查询,例如:从表中选择 primary_key IN (....);
Hibernate 似乎想要进行查询以获取 Id(我刚刚指定!),然后转到 L2 缓存。有没有办法跳过初始查询?我只想要一组按主键的实体。不确定这是 JPA 1 还是 JPA 2.0(更好地支持列表)。
我可以在循环中执行 findById() 并获得所需的结果,但这显然不是最佳的。
您将需要启用查询缓存,并且此特定查询可以缓存。这仅在 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;
}
这可能需要一些调整——还没有测试过——尤其是泛型部分。