1

我有一个带有简单长主键的实体。我做了一个查询,例如:从表中选择 primary_key IN (....);

Hibernate 似乎想要进行查询以获取 Id(我刚刚指定!),然后转到 L2 缓存。有没有办法跳过初始查询?我只想要一组按主键的实体。不确定这是 JPA 1 还是 JPA 2.0(更好地支持列表)。

我可以在循环中执行 findById() 并获得所需的结果,但这显然不是最佳的。

4

1 回答 1

0

您将需要启用查询缓存,并且此特定查询可以缓存。这仅在 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;      
} 

这可能需要一些调整——还没有测试过——尤其是泛型部分。

于 2011-10-14T20:17:56.217 回答