Родительская сущность имеет аннотацию следующим образом:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "a")
private Set<Child> b;
Дочерняя сущность имеет аннотацию следующим образом:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "col_A")
private Parent a;
При выполнении запроса FETCH соединения для Родителя через репозиторий, например:
@Query("select a " +
"from Parent a " +
"left join FETCH a.b " +
"where a.prop = <some_value> ")
Запрос работает, как и ожидалось, выполняя одно большое соединение, которое возвращает A и его дочерние элементы.Однако, если мы изменим аннотацию дочернего элемента следующим образом, запрос начнет выполняться 1 + N:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "COL_A", referencedColumnName = "COL_A"),
@JoinColumn(name = "COL_B", referencedColumnName = "COL_B")
})
private Parent a;
COL_A - это первичный ключ Parent, а COL_B - неключевой столбец, используемый в качестве раздела.