【问题标题】:empty result list with jpa on datastore数据存储上带有 jpa 的空结果列表
【发布时间】:2013-12-09 14:37:23
【问题描述】:

我正在尝试将 jpa 与应用引擎数据存储区一起使用。

持久性很好,但我似乎无法获得我在数据库中持久化的任何对象。

这是我做的方法:

公共列表 getAllBooks() {

  EntityManager em = EMF.get().createEntityManager();

  Query query = em.createQuery("select b from Book b");

  List<Book> books = (List<Book>) query.getResultList();

  em.close();

  return books;

}

奇怪的是,当我调试并查看我的结果列表时,有些东西我不明白:

1 - 我的 List 似乎实际上是一个 StreamingQueryResult,它的大小是 -1

2 - 当我在这个 StreamingQueryResult 中搜索时,我意识到我的数据库中的 3 本书实际上位于 LazyResult 中名为 resolvedPojos 的数组列表中,但我不知道如何获取它们。

有人有想法吗?

【问题讨论】:

    标签: java google-app-engine jpa google-cloud-datastore


    【解决方案1】:

    您必须对惰性集合进行显式调用才能对其进行初始化(通常的做法是为此目的调用 .size())。

    我认为“this link”解决了这个问题。 "This link" 也可以。

    【讨论】:

    • 我尝试调用 size(),但它似乎没有奏效。我不明白的是,如果只有一个实体要加载,为什么 jpa 会进行延迟加载...
    【解决方案2】:

    简单地将一些代理“列表”传回应用程序的其余部分是(恕我直言)不好的做法;您将自己暴露在 List 在延迟加载方面的任何奇怪之处。您正在关闭 EM 的事实意味着您不能容忍延迟加载。因此,只需创建您自己的列表并将查询结果列表复制到其中...关闭 EM 之前,如果想要查询结果的子项,则在执行此操作时触摸相关字段(以便加载它们),或者确保它们在查询的提取计划(DataNucleus 扩展)中。

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多