【问题标题】:LEFT JOIN FETCH doesn´t workLEFT JOIN FETCH 不起作用
【发布时间】:2018-11-01 20:18:59
【问题描述】:

如何在 JPA /Eclipselink 2.6.5 中使用三个级别的“LEFT JOIN”来获取 Table3(关系 OneToOne)?

此命令不获取它:(错误)

SELECT t1 FROM Table1 t1 LEFT JOIN FETCH t1.table2 t2
                         LEFT JOIN FETCH t2.table3

此命令获取它,但不要保留第一个“LEFT”:(错误)

SELECT t1 FROM Table1 t1 LEFT JOIN FETCH t1.table2
                         LEFT JOIN FETCH t1.table2.table3

这个获取它,但它只有两个级别:(Unwanted)

SELECT t2 FROM Table2 t2 LEFT JOIN FETCH t2.table3

表1:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "Id")
private Integer id;

@JoinColumn(name = "Table2", referencedColumnName = "Id")
@ManyToOne(fetch = FetchType.LAZY)
private Table2 table2;

表2:

@Id
@Basic(optional = false)
@NotNull
@Column(name = "Id")
private Integer id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "table2")
private Collection<Table1> table1Collection;

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "table2")
private Table3 table3;

表3:

@Id
@Basic(optional = false)
@NotNull
@Column(name = "Id")
private Integer id;

@JoinColumn(name = "Table2", referencedColumnName = "Id", insertable = false, updatable = false)
@OneToOne(fetch = FetchType.LAZY, optional = false)
private Table2 table2;

谢谢!

【问题讨论】:

标签: java jpa eclipselink


【解决方案1】:

JPA/JPQL 不支持嵌套提取连接。为了解决这个问题,您可以在查询中添加query hint,以告诉它您希望使用左外连接加入什么。 fetch-join 查询提示有一个更好的例子来展示它是如何使用的。

Query query = em.createQuery("SELECT t1 FROM Table1 t1", Table1.class);
query.setHint("eclipselink.LEFT_FETCH", "t1.table2");
query.setHint("eclipselink.LEFT_FETCH", "t1.table2.table3");

【讨论】:

    【解决方案2】:

    我认为您需要在此处对 table1 和 table2 进行右连接,因此请改用“RIGHT JOIN”重试前两个示例。

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2015-12-05
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2020-04-19
      • 2018-11-30
      相关资源
      最近更新 更多