12 Mart 2021 Cuma

JPA JPQL JOIN

Giriş
Eğer ilişki LAZY ise child nesnenin tamamını yüklemez.

Örnek
Elimizde şöyle bir JPQL olsun
FROM Employee emp
JOIN emp.department dep
SQL olarak şunu elde ederiz. Burada child nesnenin sütunlarının çekilmediği zaten görülebilir. Ancak bir proxy nesne yaratılır.
SELECT emp.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Örnek
JPQL JOIN kodla da elde edilebilir. Şöyle yaparız
@Entity
public class Author {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  ...  
  @OneToMany(fetch=FetchType.LAZY, mappedBy="author")
  private List<Book> books;
}

@Entity
public class Book {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  ...
  @ManyToOne
  private Author author;
}

public interface BookDataService extends JpaRepository<Book, Long>{
}

public interface AuthorDataService extends JpaRepository<Book, Long>{
}

List<Author> authors = authorDataService.findAll();
for (Author author : authors) {
    System.out.printf("Author: %s %s has %d books.%n",
        author.getFirstName(), author.getLastName(),
        author.getBooks().size());
}
N+1 Select Problemi
JOIN N+1 Select Problemine sebep olur. Bu duruma karşı
1. JOIN FETCH kullanılabilir
2. Hibernate FetchMode.SUBSELECT kullanılabilir

Hiç yorum yok:

Yorum Gönder