12 Mart 2021 Cuma

JPA JPQL JOIN FETCH - Inner Join Gibi Sadece Randevusu Olan Doktorları Yükler

Giriş
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 authors

SELECT *
FROM books
WHERE 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