Spring、JPA 和 Hibernate 多个查询从一个 sql 语句执行

Spring, JPA and Hibernate multiple queries executed from one sql statement

我是 Spring、JPA 和 Hibernate 的新手,如果我没有正确回答这个问题,我深表歉意。

我收到了一个使用这些框架的应用程序,该应用程序存在多个性能问题。

我进行了大量搜索都无济于事 - 可能是因为我无法正确表述我的问题。

场景是(简而言之)当一个 sql 语句通过 EntityManager 执行时,它依次调用结果集中每行的相关查询。 在我的例子中,一个 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控制台中查看),因此它们被调用由 code/framework。 EntityManager 尚未扩展,因此框架正在做这项工作。

现在我的问题 - 感谢您阅读到这里...

在 Spring、JPA 和 Hibernate 中,什么是解决此问题的最佳方法,以便一次调用数据库 returns 所需的对象而无需多次请求数据库?

我想到的一种方法是使用单个 sql 语句来调用存储过程,该存储过程可以是 return 多个结果集,也可以只有一个结果集包含所有相关对象的数据和让框架完成剩下的工作(实例化相关对象)。

我不知道如何在 Spring/JPA/Hibernate 环境中处理这个问题。 有人可以给我指点资源,让我 examples/ideas 了解如何处理这个问题吗?或者要搜索的关键字?

版本: Spring: 3.0.6.Release 休眠:3.5.0-Beta-2

非常感谢 史蒂夫

首先,这不是一个 SQL 语句,它是一个 JPQL 语句,这是一个巨大的差异(不是语法上的,而是逻辑上的)。
其次,多个 SQL 语句的原因是从工作到交易到股票的一对多关系(称为 N+1 problem). Depending on your use case you could change the relationships to lazy loading. This means, they are only loaded when you need the objects. However, this can cause other problems, if it is not handled correctly. You could also try to use Join Fetching。这将创建一个带有连接的查询,而不是如果发出一个子选择集合中的每个元素。