如果在 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 中调用本机查询,则正在执行其他查询的主要内容,如果未能解决你的问题,请参考以下文章

jpa命名本机查询无结果

如何通过 Spring Boot JPA 执行具有 INTERVAL 子句的本机 SQL 查询?

如何使用本机查询在 JPA 中执行嵌套联接

JPA 本机查询问题

JPA/Hibernate 本机查询无法识别参数

如何使用 jpa 执行本机 memsql 查询 [重复]