クエリ キャッシングを有効にし、この特定のクエリをキャッシュ可能にする必要があります。これはヒントを介して JPA 2.0 でのみ使用できます。
query.setHint(“org.hibernate.cacheable”, true);
また、次のプロパティを設定してクエリ キャッシュを有効にします。
hibernate.cache.use_query_cache true
もう 1 つの解決策は、ループ内で getReference を使用し、バッチ読み込みを有効にすることです。インスタンスがキャッシュに存在する場合は、キャッシュから返されます。そうでない場合は、プロキシされた最初のオブジェクトにアクセスしたときに 1 つのクエリが起動され、それらのバッチがロードされます。これをユーティリティ関数の背後に隠すことができます。
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;
}
これには、いくつかの調整が必要になる場合があります-テストしていません-特にジェネリック部分。