Java Spring、JPA和Hibernate从一条sql语句执行多个查询
我对Spring、JPA和Hibernate是完全陌生的,所以如果我没有正确地回答这个问题,我深表歉意 我得到了一个使用这些框架的应用程序,它有多个性能问题 我做了无数次搜索,但都无济于事——可能是因为我无法正确表达我的问题 该场景(简而言之)是,当通过EntityManager执行一条sql语句时,它会依次调用结果集每行的相关查询。 在我的例子中,一条sql语句可能会导致数百条(在某些情况下是数千条)相关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
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将缓存这些对象,并且不需要调用查询。