【问题标题】:OpenJPA fetching entity with a lazy collectionOpenJPA 使用惰性集合获取实体
【发布时间】:2018-01-22 04:46:27
【问题描述】:

我有两个实体:

答:

class A {

 @Id
 Long id;

 @OneToMany(fetch = FetchType.LAZY)
 List<B> listOfB;
}

和 B 类:

class B {

 @Id
 Long id;

 @ManyToOne(fetch = FetchType.LAZY)
 A a;
}

现在在我的 spring 数据仓库中,我正在创建一个查询,例如:

@Query("SELECT a FROM A a INNER JOIN a.listOfB b WHERE b.id = :id")

问题是,查询被执行并返回一些 A 对象,但是当我想访问 listOfB 我得到一个 NullPointerException ...

A a = aRepository.findByOwnQuery(id);
a.getListOfB().size(); -> NullPointerException

【问题讨论】:

  • 发布您的代码,并发布异常的准确和完整的堆栈跟踪。
  • 你需要什么代码?有两个实体的关系标记为惰性,还有一个查询。
  • 导致 NPE 的代码。
  • 因此列表字段为 NULL,并且对象“a”可能在此时已分离,因此无法从数据库中获取该字段。所以在取消管理“a”对象之前获取它
  • @NeilStockton 怎么样?我假设当我通过INNER JOIN a.listOfB b 加入 B 类时,我将在结果对象中有这个列表......

标签: java spring jpa spring-data-jpa


【解决方案1】:

NullPointerException 可能是因为您在父类A 中获取您的孩子listOfB 懒惰

像这样试试JOIN FETCH

@Query("SELECT a FROM A a JOIN FETCH a.listOfB b WHERE b.id = :id")

【讨论】:

  • 有了这样的结构,我得到了ArgumentException 错误Encountered "b" at ... but expected: [",", "GROUP", "HAVING", "INNER", "JOIN", "LEFT", "ORDER", "WHERE", &lt;EOF&gt;]
  • 你确定这个例外是因为我建议的单一改变吗?因为我的改变不会改变论点。它只会改变获取孩子的策略。请交叉检查。
  • 是的,因为前面的查询执行得很好,但是列表返回 null。
  • JPA 规范不允许使用在查询中的 fetch join 子句中定义的“b”。您必须为要在 where 子句中使用的查询创建单独的连接。
  • @Chris 那是我不知道的事情。你能发布一些参考。
猜你喜欢
  • 2016-04-08
  • 2019-12-07
  • 2017-11-25
  • 2014-06-21
  • 2017-02-05
  • 1970-01-01
  • 2017-06-02
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多