DEV Community

Mustafa  Çam
Mustafa Çam

Posted on

JpaRepository ve JpaSpecificationExecutor

JpaRepository

JpaRepository, Spring Data JPA tarafından sağlanan ve JPA (Java Persistence API) tabanlı veri erişim katmanını kolaylaştırmak için kullanılan bir arayüzdür. JpaRepository arayüzü, CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirmek için çeşitli metodlar sağlar. Bu arayüz, PagingAndSortingRepository arayüzünü genişletir, bu nedenle veri kümesini sayfalandırma ve sıralama desteği de sunar.

Sağladığı Metodlar

JpaRepository arayüzü, veritabanı işlemleri için bir dizi hazır metod içerir:

  • save(S entity): Verilen varlığı kaydeder veya günceller.
  • findById(ID id): Verilen kimlik değeri ile varlığı bulur.
  • findAll(): Tüm varlıkları döner.
  • findAll(Pageable pageable): Tüm varlıkları sayfalandırılmış biçimde döner.
  • deleteById(ID id): Verilen kimlik değeri ile varlığı siler.
  • count(): Varlıkların toplam sayısını döner.
  • existsById(ID id): Verilen kimlik değeri ile bir varlığın olup olmadığını kontrol eder.

Kullanım

JpaRepository arayüzünü kullanarak, veritabanı işlemleri için gerekli temel metodları kolayca ekleyebilirsiniz. İşte bir örnek:

package com.example.demo.repository;

import com.example.demo.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    // Ekstra sorgular buraya eklenebilir
}
Enter fullscreen mode Exit fullscreen mode

JpaSpecificationExecutor

JpaSpecificationExecutor, Spring Data JPA tarafından sağlanan ve JPA kriter tabanlı sorgularını gerçekleştirmek için kullanılan bir arayüzdür. Bu arayüz, dinamik ve esnek sorgular oluşturmayı sağlar.

Sağladığı Metodlar

JpaSpecificationExecutor arayüzü, kriter tabanlı sorgular için çeşitli metodlar içerir:

  • findAll(Specification spec): Verilen spesifikasyona uygun tüm varlıkları bulur.
  • findAll(Specification spec, Pageable pageable): Verilen spesifikasyona uygun tüm varlıkları sayfalandırılmış biçimde bulur.
  • count(Specification spec): Verilen spesifikasyona uygun varlıkların sayısını döner.
  • exists(Specification spec): Verilen spesifikasyona uygun varlıkların olup olmadığını kontrol eder.

Kullanım

JpaSpecificationExecutor arayüzü, dinamik sorgular oluşturmak için kullanılır. Bu sorgular, Specification arayüzü kullanılarak tanımlanır. İşte bir örnek:

package com.example.demo.repository;

import com.example.demo.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long>, JpaSpecificationExecutor<Product> {
    // Ekstra sorgular ve spesifikasyonlar buraya eklenebilir
}
Enter fullscreen mode Exit fullscreen mode

Specification Kullanımı

Specification arayüzü, kriter tabanlı sorgular oluşturmak için kullanılır. İşte bir örnek:

package com.example.demo.specification;

import com.example.demo.model.Product;
import org.springframework.data.jpa.domain.Specification;

public class ProductSpecification {

    public static Specification<Product> hasName(String name) {
        return (root, query, criteriaBuilder) ->
                criteriaBuilder.equal(root.get("name"), name);
    }

    public static Specification<Product> hasPrice(BigDecimal price) {
        return (root, query, criteriaBuilder) ->
                criteriaBuilder.equal(root.get("price"), price);
    }
}
Enter fullscreen mode Exit fullscreen mode

Bu spesifikasyonlar daha sonra repository metodlarında kullanılabilir:

import com.example.demo.model.Product;
import com.example.demo.repository.ProductRepository;
import com.example.demo.specification.ProductSpecification;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    public List<Product> findProductsByNameAndPrice(String name, BigDecimal price) {
        return productRepository.findAll(
                Specification.where(ProductSpecification.hasName(name))
                             .and(ProductSpecification.hasPrice(price))
        );
    }
}
Enter fullscreen mode Exit fullscreen mode

Bu şekilde, JpaRepository ve JpaSpecificationExecutor arayüzleri ile CRUD işlemleri ve dinamik sorgular için güçlü ve esnek bir veri erişim katmanı oluşturabilirsiniz.

Top comments (0)