如果在 jpa 中调用本机查询,则正在执行其他查询
Posted
技术标签:
【中文标题】如果在 jpa 中调用本机查询,则正在执行其他查询【英文标题】:other queries are executing if native query is called in jpa 【发布时间】:2017-08-23 08:22:15 【问题描述】:我有一个名为 Test.java 的实体,它有 70 个字段,其中一些字段还与其他实体相关(通过一对多、多对一等关联)。
我需要一个这种类型的对象,但我不需要所有字段,只需要其中的 3 个字段,一个字段与其他实体有外键关系。
所以,我在执行查询时编写了一个本机查询 jpa 执行其他查询也会导致花费这么多时间来完成。
这是我的实体类:
public Class Test implements Serializable
@Id
private int id;
@ManyToOne
@JoinColumn(name = "STATUSID")
private xxxxx xxxxx;
/// other fields, getters and setters
这是我的原生查询
public List<Order> getAllOpenOrders()
final String query = "SELECT t.* from T_TEST";
Query createNativeQuery = em.createNativeQuery(query, Test.class);
List<Order> resultList = createNativeQuery.getResultList();
return resultList;
如何获取带有选定字段的订单实体对象,我不需要其他字段意味着我只使用这三个字段来实现我的功能。
如何停止其他查询的执行?
谢谢。
【问题讨论】:
正在执行哪些“其他查询”?您是如何发现与此原生查询一起运行的其他查询的? 我使用 jpa 和 eclipse 链接作为持久性提供程序,我可以在 glassfish 服务器日志中看到 SQL 日志。其他查询意味着该实体也与其他实体有关系。所以与其他实体相关的查询也进入日志文件 我认为在调用本机查询之前,您可能正在执行更多查询(不是本机查询,而是休眠查询,如 entitymanager.persist 等)。 Hibernate 不会立即执行非本地查询,当您发送本地查询时,它也会执行所有待处理的非本地查询。 【参考方案1】:您可以使用Projections
仅选择您需要的那些列。您不必为此求助于本机查询。
据我记得(我很久以前调试过),hibernate 在执行本机查询之前会进行刷新。这也会导致在执行本机查询之前执行所有待处理的查询。在您看到一些其他查询的情况下,可能就是这种情况。
您可以使用Projections
,这是一种只选择所需列的更简洁的方法。
在这里回答:https://***.com/a/11626877/564503
【讨论】:
感谢您的响应,首先我尝试使用标准 api 只是出现了同样的问题,这就是我编写本机查询的原因。顺便说一下,此查询将首先执行,因为此代码将在 EJB 调度程序中,没有其他待处理的查询以上是关于如果在 jpa 中调用本机查询,则正在执行其他查询的主要内容,如果未能解决你的问题,请参考以下文章