JPA ile DTO Kullanarak Tablo Birleştirme (Join) – Spring Boot Projection Rehberi
JPA (Java Persistence API) ve DTO (Data Transfer Object) kullanarak çoklu tablo birleştirme işlemlerini Spring Boot üzerinde nasıl yapabileceğinizi örnek kodlarla anlatıyoruz. JPA DTO projection, inner join ve veri listeleme odaklı bir rehber.
JPA ve DTO Kullanarak Çoklu Tablo Birleştirme Nedir?
JPA, ilişkisel veritabanlarından veri çekerken genellikle entity sınıflarıyla çalışır. Ancak yalnızca gerekli alanları uygulama katmanına taşımak istediğinizde DTO kullanmak performans ve okunabilirlik sağlar. Birden fazla tabloyu JOIN ile birleştirip sonuçları DTO yapısına dönüştürmek gereksiz veri taşınmasını önler, sorgu sürelerini kısaltır ve katmanlar arası bağımlılıkları azaltır.
Spring Boot’ta OneToMany İlişkisi: Post ve PostComment
Post Entity
@Entity
@Table(name = "post", schema = "public")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Post implements Serializable {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "post", orphanRemoval = true)
private List<PostComment> commentsList = new ArrayList<>();
// Diğer alanlar
}
PostComment Entity
@Entity
@Table(name = "post_comment")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PostComment implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
@Column(name = "name")
private String name;
@Column(name = "comment")
private String comment;
}
Not:@ManyToOne(fetch = FetchType.LAZY)ile tembel yükleme (lazy) tercih edilmiştir. Özel durumlardaEAGERdüşünülebilir; ancak N+1 sorgu ve bellek maliyeti açısından dikkatli olun.
JPA Inner Join ile Veri Listeleme
JOIN FETCH ile entity bazlı verileri ilişkiyle birlikte çekebilirsiniz:
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("SELECT p FROM Post p JOIN FETCH p.commentsList")
Post postComments();
}
Tüm alanlar yerine sadece belirli sütunlar hedefleniyorsa DTO projection daha uygundur.
JPA DTO Projection ile Özelleştirilmiş Veri Çekme
DTO Sınıfı
@Getter
@Setter
@AllArgsConstructor
public class PostPostCommentDto {
private String title;
private String name;
private String comment;
}
Repository Sorgusu
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("SELECT new com.example.dto.PostPostCommentDto(p.title, pc.name, pc.comment) FROM Post p INNER JOIN p.commentsList pc")
List<PostPostCommentDto> postCommentsNameList();
}
- Yalnızca gerekli alanları döndürerek performans kazanırsınız.
- İstemciye taşınan veri küçülür, ağ maliyeti azalır.
- İş katmanında sade DTO nesneleriyle çalışılır.
DTO Projection’ın Avantajları
- Performans Artışı: Gereksiz sütunlar çekilmez.
- Kod Temizliği: Entity yerine sade DTO’lar kullanılır.
- Veri Güvenliği: Hassas alanlar dışarıya taşınmaz.
- Bakım Kolaylığı: Entity değişikliklerinden daha az etkilenir.
Hibernate’in Ürettiği SQL
SELECT
post0_.title AS col_0_0_,
commentsli1_.name AS col_1_0_,
commentsli1_.comment AS col_2_0_
FROM
public.post post0_
INNER JOIN
post_comment commentsli1_ ON post0_.id = commentsli1_.post_id;
Sonuç
Bu rehberde JPA ile tabloları birleştirme, Spring Boot DTO projection kullanımı, inner join ile çoklu tablo veri çekme ve Entity → DTO dönüşümlerini ele aldık. Spring Boot projelerinde DTO projection kullanımı, hem uygulama performansını artırır hem de kodu sadeleştirir.
Daha Fazla Kaynak
- Latest Software Developers
- Medium Blog
- JPA ile Projection İşlemi – Eray Erdem