【问题标题】:Are JPA named queries are eagerly fetched by default?默认情况下是否急切地获取 JPA 命名查询?
【发布时间】:2023-03-23 10:08:02
【问题描述】:

我正在使用 JPA 和 hibernate 作为实现

我有以下应用程序代码

CustomerData customerData = (Customer) getCustomerDataDAO().getObjectByNamedQuery("Customerdata.findByCustomername", queryParameters);

调用下面的方法

@Override
    @SuppressWarnings("unchecked")
    public <T> getByNamedQuery(final String queryName) {
        Query queryObject = entityManager.createNamedQuery(queryName);
             return queryObject.getResultList().get(0);
    }

现在查询会在 queryObject.getResultList() 执行后立即触发。当我访问一些客户数据的属性时,我期待查询会被触发。 默认情况下是否会急切获取 JPA 命名查询?

【问题讨论】:

  • 所有查询,无论是否命名,都会在您调用 getResultList() 时执行。正如 javadoc 所说:docs.oracle.com/javaee/6/api/javax/persistence/…执行 SELECT 查询并将查询结果作为无类型列表返回。
  • 顺便说一句,你怎么能在没有列表的情况下访问列表的第一个元素? JPA 如何在不执行查询的情况下返回填充列表?
  • 哦,我错过了。我认为当您访问域对象属性时也会执行查询,就像 get 等会话方法一样。请将其发布为答案,以便我接受它
  • @JB Nizet 你能看看stackoverflow.com/questions/34242610/…,如果可能的话,分享你的想法吗?

标签: java hibernate jpa


【解决方案1】:

当您调用getResultList() 时,将执行所有查询,无论是否命名。正如the javadoc 所说:

执行 SELECT 查询并将查询结果作为无类型列表返回。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2011-02-12
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多