JOIN FETCH sadece randevusu olan doktorları yükler
Örnek - ManyToOne
Elimizde şöyle bir kod olsun
@Entity(name = "Post") @Table(name = "post") public class Post { @Id private Long id; private String title; //Getters and setters omitted for brevity } @Entity(name = "PostComment") @Table(name = "post_comment") public class PostComment { @Id private Long id; @ManyToOne private Post post; private String review; //Getters and setters omitted for brevity }
Şöyle yaparız
List<PostComment> comments = entityManager.createQuery(""" select pc from PostComment pc join fetch pc.post p """, PostComment.class) .getResultList(); for(PostComment comment : comments) { ... }
Select cümlesi şöyle
SELECT ... FROM post_comment pc INNER JOIN post p ON pc.post_id = p.id
Örnek - ManyToMany
Şöyle yaparız
public class User implements UserDetails { ... @ManyToMany private Set<Role> roles; } public interface UserRepository extends JpaRepository<User,Long> { @Query("select u from User u join FETCH u.roles where u.email=:p_email") Optional<User> findByEmailWithRoles(@Param("p_email") String email); }
Not
Örneklerde JPQL JOIN FETCH SQL'e çevrilince ortaya INNER JOIN çıkıyor. Aslında INNER JOIN tek SQL cümlesine sebep oluyor ancak tek yöntem değil. Benzer sonucu şöyle de elde edebilirdik. Burada iki tane SQL cümlesi çalıştırılıyor
SELECT *FROM authors;-- pretend this returns 3 authorsSELECT *FROM booksWHERE author_id in (1, 2, 3); -- an array of the author's ids
Örnek
Elimizde şöyle bir kod olsun
public interface AuthorDataService extends JpaRepository<Author, Long>{@Query("select a from Author a join fetch a.books")List<Author> findAll();}
SQL olarak şunu elde ederiz. Burada child nesnenin sütunlarının çekildiği görülebilir.
select author0_.*,books1_.*, from author author0_inner join book books1_ on author0_.id=books1_.author_id
Eğer duplicate Author geliyorsa şöyle yaparız
public interface AuthorDataService extends JpaRepository<Author, Long>{@Query("select distinct a from Author a join fetch a.books")List<Author> findAll();}
SQL olarak şunu elde ederiz. Burada child nesnenin sütunlarının çekildiği görülebilir.
select distinct author0_.*,books1_.*, from author author0_inner join book books1_ on author0_.id=books1_.author_id
Örnek
Şöyle yaparız
SELECT d FROM Doctor d
JOIN FETCH d.appointments
Örnek
Elimizde şöyle bir JPQL olsun
FROM Employee emp
JOIN FETCH emp.department dep
SQL olarak şunu elde ederiz. Burada child nesnenin sütunlarının çekildiği görülebilir. SELECT emp.*, dept.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Query DSL Kütüphanesi
QueryDSL ve JOOQ kütüphaneleri ile join fetch yapabilmek mümkün.
Hiç yorum yok:
Yorum Gönder