【问题标题】:other queries are executing if native query is called in jpa如果在 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 不会立即执行非本地查询,当您发送本地查询时,它也会执行所有待处理的非本地查询。

标签: java jpa oracle11g


【解决方案1】:

您可以使用Projections 仅选择您需要的那些列。您不必为此求助于本机查询。

据我记得(我很久以前调试过),hibernate 在执行本机查询之前会进行刷新。这也会导致在执行本机查询之前执行所有待处理的查询。在您看到一些其他查询的情况下,可能就是这种情况。

您可以使用Projections,这是一种只选择所需列的更简洁的方法。

在这里回答:https://stackoverflow.com/a/11626877/564503

【讨论】:

  • 感谢您的响应,首先我尝试使用标准 api 只是出现了同样的问题,这就是我编写本机查询的原因。顺便说一下,此查询将首先执行,因为此代码将在 EJB 调度程序中,没有其他待处理的查询
猜你喜欢
  • 2013-06-16
  • 2018-01-21
  • 2017-05-13
  • 2013-03-26
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多