Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring、JPA和Hibernate从一条sql语句执行多个查询_Java_Spring_Hibernate_Jpa_One To Many - Fatal编程技术网

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

Java Spring、JPA和Hibernate从一条sql语句执行多个查询,java,spring,hibernate,jpa,one-to-many,Java,Spring,Hibernate,Jpa,One To Many,我对Spring、JPA和Hibernate是完全陌生的,所以如果我没有正确地回答这个问题,我深表歉意 我得到了一个使用这些框架的应用程序,它有多个性能问题 我做了无数次搜索,但都无济于事——可能是因为我无法正确表达我的问题 该场景(简而言之)是,当通过EntityManager执行一条sql语句时,它会依次调用结果集每行的相关查询。 在我的例子中,一条sql语句可能会导致数百条(在某些情况下是数千条)相关sql语句被调用,从而导致服务器死机 一个人为的例子可能是: public class J

我对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();
公共类作业
{
公共长期工单;
公共字符串名称;
公开上市交易;
} 
公共类事务
{
公共长事务ID
公开上市股票;
}
公开股
{
公共长股票ID;
公共字符串名称;
}
代码使用如下语句:
String jpaQuery=“从作业j中选择不同的j,其中j.jobId=:jobId按名称排序asc”;
Query Query=entityManager.createQuery(jpaQuery);
//设置参数。。。
//这将返回一个列表,其中包含事务和股票对象的列表
返回query.getResultList();
执行这个sql语句会导致执行多个sql语句(可以在tomcat日志/eclipse控制台中查看),因此代码/框架会调用它们。 EntityManager尚未扩展,因此框架正在进行工作

现在我的问题-谢谢你读到这里

在Spring、JPA和Hibernate中,实现这一点的最佳方法是什么?这样,对数据库的一次调用将返回所需的对象,而无需对数据库进行多次请求

我的想法是使用一条sql语句来调用存储过程,它可以返回多个结果集,也可以只返回一个结果集,其中包含所有相关对象的数据,并让框架完成其余的工作(实例化相关对象)

我不知道如何在Spring/JPA/Hibernate环境中实现这一点。 有人能给我指一些资源吗?这些资源可以为我提供关于如何实现这一点的示例/想法?或者要搜索的关键字

版本: 弹簧:3.0.6.0释放 Hibernate:3.5.0-Beta-2

非常感谢
Steve

首先,这不是一个SQL语句,而是一个JPQL语句,这是一个巨大的区别(不是语法方面的,而是逻辑方面的)。

其次,使用多个SQL语句的原因是从作业到事务再到股票的一对多关系(称为)。根据您的用例,您可以将关系更改为。这意味着,它们仅在需要对象时加载。但是,如果处理不当,可能会导致其他问题。您也可以尝试使用。这将创建一个带有联接的查询,如果集合中的每个元素都发出一个子选择,则会创建一个查询。

感谢dunni的快速响应和澄清。所有对象都需要一次加载。我将查看链接,当然,一旦我了解了语法,join fetch看起来是一种方式。我有一个类似的问题。所有外来行(我在多个地方使用
@OneToOne
@OneToMany
)都被带有
WHERE
语句的SQL查询清楚地(分别)加载。我不知道怎样才能摆脱WHERE语句?我知道
FetchMode.LAZY
,但这只会延迟问题的出现,直到用户群增长。我目前使用默认值(
EAGER
)。有没有办法告诉JPA(这里只使用了
javax.persistence.*
)获取整个表?RAM不是问题,但性能可能是问题。通过使用Hibernates二级缓存(),您可以将此问题减少到三个查询。首先查询股票,然后查询交易,然后查询作业。这取决于您是否能够创建一个查询以获取所有必需的库存,以及创建一个查询以获取所有必需的交易。第二级缓存将阻止对每个股票和交易进行单独查询,因为Hibernate将缓存这些对象,并且不需要调用查询。