我对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。这将创建一个带有联接的查询,而不是如果对集合中的每个元素发出一个子查询。

08-04 17:00