spring+hibernateを使用して構築されたJavaWebアプリケーションがあります。
私はこのようなコードを持っています:
for (Account account : accountList){
Client client = clientService.findById(account.getFkClient()); // fkClient is foreign key to Client
if (client != null) {
...
anObject.setName(client.getName());
anObject.setAccountNo(account.getAccountNo());
...
}
else {
...
anObject.setAccountNo(account.getAccountNo());
...
}
...
}
accountListは、休止状態の呼び出しから取得したアカウントエンティティのリストです。forループ内では、 clientService.findByIdメソッド内の休止状態呼び出しを使用してクライアントエンティティがアカウントから取得されます。
これらは、呼び出しに関係するクラスです。
public class ClientService implements IClientService {
private IClientDAO clientDAO;
...
@Override
public Client findById(Long id) throws Exception {
return clientDAO.findById(id);
}
}
public class ClientDAO extends AbstractHibernateDAO<Client, Long> implements IClientDAO {
@Override
public Client findById(Long id) throws Exception {
return super.findById(id);
}
}
public class AbstractHibernateDAO<T,Y extends Serializable> extends HibernateDaoSupport {
protected Class<T> domainClass = getDomainClass();
private Class<T> getDomainClass() {
if (domainClass == null) {
ParameterizedType thisType = (ParameterizedType) getClass().getGenericSuperclass();
domainClass = (Class<T>) thisType.getActualTypeArguments()[0];
}
return domainClass;
}
public T findById(final Y id) throws SystemException {
return (T) this.execute(new HibernateCallback<T>() {
@Override
public T doInHibernate(Session session) throws HibernateException, SQLException {
return (T) session.get(domainClass, id);
}
});
}
}
注:clientServiceとclientDAOはSpringBeanオブジェクトです。
私の質問は、休止状態でループ内のclientService.findByIdを最適化する方法ですか?findById呼び出しにより、ループプロセスが遅くなるように感じます。
accountListには通常7000以上のレコードが含まれているため、jdbcのPreparedStatementsのようなプリコンパイルされたクエリメカニズムのようなものが必要です。Hibernateでこれを行うことは可能ですか?
注:上記のコードは、無関係な部分を削除することで簡略化されています。メソッド、変数、クラス名は、プライバシー上の理由から架空のものになっています。コードを手動で入力したので、タイプミスを見つけた場合は、コメントセクションでお知らせください。