我对Spring,JPA和Hibernate完全陌生,因此,如果我不能正确解决这个问题,我们深表歉意。
使用这些框架的应用程序出现了多个性能问题。
我进行了无数次搜索,无济于事-可能是由于我无法正确表达我的问题。
简而言之,当通过EntityManager执行一个sql语句时,它依次在结果集的每一行调用一个相关查询。
在我的情况下,一个sql语句可能导致数百个(在某些情况下为数千个)相关的sql语句被调用-杀死我们的服务器。
一个人为的例子可能是:
public class Job
{
public long jobId;
public String name;
public List<Transaction> transactions;
}
public class Transaction
{
public long transactionId
public List<Stock> stocks;
}
public class Stock
{
public long stockId;
public String name;
}
The code uses a statement like:
String jpaQuery = "select distinct j from Job j where j.jobId = :jobId order by name asc";
Query query = entityManager.createQuery(jpaQuery);
//set parameters...
//This will return a List<Job>, containing lists of Transaction and Stock objects
return query.getResultList();
执行此单个sql语句会导致执行多个sql语句(可以在tomcat日志/ eclipse控制台中查看),因此它们被代码/框架调用。
EntityManager尚未扩展,因此框架正在进行工作。
现在我的问题-感谢您阅读本文...
在Spring,JPA和Hibernate中,什么是最好的方法,所以一次调用数据库将返回所需的对象而无需多次请求数据库?
我想到的一种方法是使用单个sql语句来调用存储过程,该存储过程可以返回多个结果集,也可以仅返回一个包含所有相关对象数据的结果集,并由框架执行其余操作(实例化相关对象)。
我不知道如何在Spring / JPA / Hibernate环境中实现这一目标。
有人可以向我指出一些资源,这些资源可以为我提供有关如何实现此目标的示例/想法吗?还是要搜索的关键字?
版:
春季:3.0.6。发布
休眠:3.5.0-Beta-2
非常感谢
史蒂夫
最佳答案
首先,这不是SQL语句,而是JPQL语句,这是一个巨大的差异(不是语法上的,而是逻辑上的)。
其次,使用多个SQL语句的原因是从工作到交易再到库存的一对多关系商店(称为N+1 problem)。根据您的用例,您可以将关系更改为lazy loading。这意味着,仅在需要对象时才加载它们。但是,如果处理不当,这可能会导致其他问题。您也可以尝试使用Join Fetching。这将创建一个带有联接的查询,而不是如果对集合中的每个元素发出一个子查询。