我有两张表“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 ...;
我收到错误:找不到表“获取”。
答案 0 :(得分:1)
为什么要在JPQL中使用引号? JPQL是基于实体的,而不是基于表的。尝试“选择a,b从A a,B b ......”。使用实体名称和实体中映射的属性来形成查询。
如果您收到延迟初始化错误,则表示您在未获取的实体之间存在关系。获取它们允许实体序列化,并且在反序列化时使用另一端的关系。但是fetch只是一个JPA概念 - 你为什么要在SQL中创建一个JPQL查询?
答案 1 :(得分:0)
您不能将FROM a, b
与LEFT JOIN
混合使用。您可以使用带有FROM a,b
子句的WHERE
来加入实体/表,也可以将@ManyToOne
或@OneToMany
添加为实体的属性,以便正确使用{{1如果a,b或c之间存在关系。要避免LazyInitialization,您必须从查询中获取实体的结果列表,然后在事务中调用要延迟加载的字段名称的getter,以便Hibernate知道延迟加载它。例如:LEFT JOIN
否则您可以使用a.getC();