gpt4 book ai didi

java - 如何优化hibernate循环中的方法调用?

转载 作者:行者123 更新时间:2023-12-02 07:09:54 28 4
gpt4 key购买 nike

我有一个使用 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 是从 hibernate 调用中检索到的帐户实体列表。在 for 循环内,使用 clientService.findById 方法内的 hibernate 调用从帐户中检索客户端实体。

这些是调用涉及的类:

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 对象。

我的问题是如何使用 hibernate 优化循环内的 clientService.findById ?我觉得 findById 调用使​​循环过程变得更慢。

accountList通常包含7000+条记录,所以我需要像jdbc中的PreparedStatements那样的预编译查询机制。可以用 hibernate 来做到这一点吗?

注意:上面的代码已经通过删除不相关的部分进行了简化,出于隐私原因,方法、变量和类名都是虚构的。如果您发现拼写错误,请在评论部分告诉我,因为我手动输入了代码。

最佳答案

在 Hibernate/JPA 中,您可以使用 Hibernate 查询语言/JPA 查询语言编写查询并创建 NamedQueries。 NamedQuery 在服务器启动时编译,因此您可以将其视为某种准备好的语句。

您可以尝试编写 HQL 查询,它可以通过单个查询获取所有实体实例。

我将为您提供 JPQL 示例,但您也可以使用 HQL 编写。

@NamedQueries({
@NamedQuery(name = "QUERY_BY_ID",
query = "SELECT u from SomeEntity se WHERE se.id IN (:idList)"),
})
class SomeEntity {
}

class SomeEntityDao {
public List<SomeEntity> findIdList(List<Long> idList) {
Query query = entityManager.createNamedQuery("QUERY_BY_ID");
query.setParameter("idList", idList);

return query.getResultList();
}
}

关于java - 如何优化hibernate循环中的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15657400/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com