LEFT JOIN FETCH не работает - PullRequest
0 голосов
/ 23 мая 2018

Как получить Table3 (отношение OneToOne), используя три уровня «LEFT JOIN» в JPA / Eclipselink 2.6.5?

Эта команда не получает его: (Неверно)

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

Эта команда извлекает ее, но не сохраняет первой "ВЛЕВО": (неверно)

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

Эта выборка, но только два уровня: (нежелательные)

SELECT t2 FROM Table2 t2 LEFT JOIN FETCH t2.table3

Table1:

@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;

Table2:

@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;

Table3:

@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;

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

JPA / JPQL не поддерживает соединения с вложенными выборками.Чтобы обойти это, вы можете добавить подсказку запроса к вашему запросу, чтобы сообщить ему, что вы хотите соединить, используя левое внешнее соединение.Подсказка запроса 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");
0 голосов
/ 23 мая 2018

Я думаю, вам нужно сделать правильное соединение между таблицами table1 и table2, поэтому попробуйте оба первых примера, используя вместо этого «RIGHT JOIN».

...