1

我有 2 个表“A”和“B”。我想从这些表中读取数据。首先是 JPA。如果我执行以下操作:

select a as a, b as b
from "A" a, "B" b
where ...;

我收到一条延迟初始化错误消息。

这就是我添加声明的原因

left join fetch a."c" c

这解决了这个问题。现在我在 SQL 语句中需要相同的内容。我可以使用什么来获取左连接?

如果我尝试

select a as a, b as b
from "A" a, "B" b
left join fetch a."c" c
where ...;

我收到错误:找不到表“获取”。

4

2 回答 2

1

为什么要在 JPQL 中的属性周围加上引号?JPQL 是基于实体的,而不是基于表的。尝试“从 A a, B b where ..中选择 a, b”。使用实体名称和实体内映射的属性来形成您的查询。

如果你得到一个惰性初始化错误,这意味着你有未获取的实体之间的关系。获取它们允许对实体进行序列化,并在反序列化时在另一端使用关系。但是 fetch 是一个 JPA 唯一的概念 - 你为什么要尝试在 SQL 中创建一个 JPQL 查询?

于 2013-09-16T15:40:03.397 回答
0

您不能FROM a, bLEFT JOIN. 您要么使用FROM a,bwithWHERE子句连接实体/表,要么必须添加@ManyToOneor@OneToMany作为实体的属性,以便LEFT JOIN在 a、b 或 c 之间存在关系时正确使用。为了避免 LazyInitialization,您必须从查询中获取实体的结果列表,然后在事务中调用要延迟加载的字段名称的 getter,以便 Hibernate 知道延迟加载它。例如:a.getC();否则你可以使用SELECT c FROM a LEFT JOIN FETCH a.c c

于 2013-09-16T22:54:11.483 回答