我有一个使用 spring+hibernate 构建的 java web 应用程序。
我有这样的代码:
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 是从休眠调用中检索到的 Account 实体的列表。在 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 是 spring beans 对象。
我的问题是如何使用休眠优化循环内的clientService.findById?我觉得 findById 调用使循环过程变慢。
accountList 通常包含 7000+ 条记录,所以我需要类似 jdbc 中的 PreparedStatements 之类的预编译查询机制。可以用休眠来做到这一点吗?
注意:上面的代码已经通过删除不相关的部分进行了简化,出于隐私原因,方法、变量和类名都是虚构的。如果您发现错字,请在评论部分告诉我,因为我手动输入了代码。