Posiadam Kilka encji
public class User extends implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy="user")
@EqualsAndHashCode.Exclude
@ToString.Exclude
private List<Book> books;
}
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="")
private LocalDateTime effectiveDateTo;
@EqualsAndHashCode.Exclude
@ManyToOne
@JoinColumn(name="")
private User user;
@OneToMany(mappedBy="Book")
@EqualsAndHashCode.Exclude
@ToString.Exclude
private List<BookDocument> bookDocument = new ArrayList<>();
}
public class BookDocument implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="")
private LocalDateTime dateTo;
@ManyToOne
@JoinColumn(name="")
private Book Book;
}
Chcę pobrać konkretnego usera, ale z joinowaniem się do kolejnych tabel, tak żeby odfiltrować tylko pasujące rekordy - odfiltrowywuje najpierw nie pasujące z Book, a następnie z tych chcę wybrać właściwe z BookDocument.
Jedyne co udało mi się uzyskać, to zamiast JOIN User - Book, zrobiłem fetch i dodałem predykat z warunkami. Wtedy uzyskałem na "pierwszym" poziomie właściwy wynik, ale dla BookDocuments już to nie działa. Zresztą, nie pzowala mi hibernate na zrobienie dwóch fetchy. Próbowałem napisać sql i natywnie i z użyciem JPQL, ale efekt ten sam niezadawalający. Zmieniałem też typ złączenia na jawne wymuszenie EAGER, ale nie pomogło... zresztą, nie chce mieć eager, bo każdorazowo odnosząc się do usera nie potrzebuje tych kolejnych tabel pobierać...
Użycie join i warunków czy w on czy w wherze i tak zwraca wszystkie powiązania.... Nie wydaje mi się, żeby zwracanie zawsze wszystkich dowiązań było pożądane i poprawne, chyba, że jednak spring czy hibernate to wymusza, że tak ma być i koniec?
Próbowałem użyć JPAStreamer, ale póki co to chyba ten projekt jest w powijakach i nie da się zrobić złączenia A->B->C i jeszcze filtrować.
Da się w jakiś sposób wymusić stosowanie warunków where... czy jedyny sposób to querydsl i ręczne dłubanie sql?