9 Aralık 2019 Pazartesi

SpringData JpaRepository Arayüzü

Giriş
Şu satırı dahil ederiz.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
Maven
Şu satırı dahil ederiz.
<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-jpa</artifactId>
  <version>1.11.9.RELEASE</version>
</dependency>
Şeklen şöyle

JpaRepository ile findAll(Pageable), findAll(Sort) flush(), saveAndFlush(S) gibi kullanışlı metodlar geliyor

EntityManager İlişkisi

Kalıtım
Açıklaması şöyle. Yani transaction, sayfalama ve sıralama işlemlerini destekler.
JpaRepository – which extends PagingAndSortingRepository and, in turn, the CrudRepository. Each of these defines its own functionality:
- CrudRepository provides CRUD functions
- PagingAndSortingRepository provides methods to do pagination and sort records
- JpaRepository provides JPA related methods such as flushing the persistence context and delete records in a batch
Örnek
Elimizde şöyle bir kod olsun
interface PaymentMethodsDao extends JpaRepository<PaymentMethods, Integer> {}
Bu sınıftan kalıtınca otomatik olarak şu metodlar gelir.
PaymentMethod save(PaymentMethod entity);
Iterable<PaymentMethod> save(Iterable<? extends PaymentMethod> entities);
PaymentMethod findOne(Integer id);
boolean exists(Integer id);
Iterable<PaymentMethod> findAll();
long count();
void delete(Integer id);
void delete(PaymentMethod entity);
void delete(Iterable<? extends PaymentMethod> entities);
void deleteAll();
Iterable<PaymentMethod> findAll(Sort sort);
Page<PaymentMethod> findAll(Pageable pageable);
List<PaymentMethod> findAll();
List<PaymentMethod> findAll(Sort sort);
List<PaymentMethod> save(Iterable<? extends PaymentMethods> entities);
void flush();
PaymentMethod saveAndFlush(PaymentMethods entity);
void deleteInBatch(Iterable<PaymentMethods> entities);
Tanımlama
Template parametrelerinin açıklaması şöyle
@Repository
public interface UserRepository extends JpaRepository<DataType<data_type,primary_key>>
Şöyle yaparız.  Spring'in kuralların uygun yazılan metod imzaları için Spring kod üretir.
@Repository
public interface CartRepository extends JpaRepository<Cart, Long> {
  ...
}
Eğer istersek arayüzün için tamamen boş olabilir. Şöyle yaparız. Bu durumda Spring JpaRepository'den gelen metodları üretir.
public interface CustomerRepository extends JpaRepository<Customer, Long> {
    // Can be empty or you can more queries like findByXXX().
}
Cache
Cache desteği için şöyle yaparız.

count metodu
İmzası şöyle.
long count();
delete metodu
İmzası şöyle. İlk metod hariç diğerleri belirtilen entity nesnesini siler.
void delete(Integer id);
void delete(PaymentMethod entity);
void delete(Iterable<? extends PaymentMethod> entities);
Örnek
Şöyle yaparız. deleteBy() ile aynıdır.
productRepository.delete(productId);
Örnek
Şöyle yaparız.
productRepository.delete(product);
deleteBy metodu
Şöyle yaparız.
Long id = ...;

System.out.println("Deleting product with id: " + id);

// Defined in CrudRepository
repo.deleteById(id);
deleteAll metodu
İmzası şöyle.
void deleteAll();
Bu metodla ilgili bir şikayet şöyle
The spring boot JPA uses a SELECT * in its deleteAll method as the default implementation. It was reading all rows and then executing the delete method on all of them individually.
Couldn’t a simple implementation of the “delete from [table name]” have sufficed?

deleteInBatch metodu
İmzası şöyle.
void deleteInBatch(Iterable<PaymentMethods> entities);
exists metodu
İmzası şöyle.
boolean exists(Integer id);
getX findX metodları
Bu metodlar altta aynı kapıya çıkarlar. Sorgu metodları şu isimler ile başlayabilir.
private static final String QUERY_PATTERN = "find|read|get|query|stream";
Açıklaması şöyle.
As you can see, all method names start with find or get. This is a well-known convention in the industry, and it's used by libraries such as Spring Data or Apache DeltaSpike. Methods starting with find return a collection of objects, while methods starting with get return single, ready-to-use values (such as a domain instance, or one of its properties).
getById - Deprecated Kullanmayın
Kod şöyle
@Deprecated
public T getById(ID id) {
  return this.getReferenceById(id);
}
getOne - Deprecated Kullanmayın
@Deprecated
public T getOne(ID id) {
  return this.getReferenceById(id);
}
findAll metodu
findAll yazısına taşıdım.

findByXXX metodu
Derived Query - findByXXX yazısına taşıdım

findById metodu
@Id olarak işaretli alana göre arama yapar. findById yazısına taşıdım

findByXOrderByAsc metodu
Örnek
Şöyle yaparız.
public interface StudentDAO extends JpaRepository<StudentEntity, Integer>
{
  public List<StudentEntity> findAllByOrderByIdAsc();
}
findDistinctByX metodu
findDistinctBy yazısına taşıdım.

findOne metodu
İmzası şöyle.
PaymentMethod findOne(Integer id);
flush metodu
İmzası şöyle.
void flush();
getFirstX metodu
Örnek
Şöyle yaparız.
public interface MessageJpaRepository extends JpaRepository<MessageEntity, Long> {
    MessageEntity getFirstByOrderByRegistrationDesc();
}
save metodu
İmzası şöyle.
PaymentMethod save(PaymentMethod entity);
Iterable<PaymentMethod> save(Iterable<? extends PaymentMethod> entities);
List<PaymentMethod> save(Iterable<? extends PaymentMethods> entities);
Metodun için şöyle.
@Transactional
public <S extends T> S save(S entity) {
  if(this.entityInformation.isNew(entity)) {
    this.em.persist(entity);
    return entity;
  } else {
   return this.em.merge(entity);
  }
}
saveAndFlush metodu
İmzası şöyle.
PaymentMethod saveAndFlush(PaymentMethods entity);
Tabloya yapılan işlemin hemen görülmesi için kullanılır. Şöyle yaparız.
@Transactional
public void saveAndGenerateResult(Data data) {
    saveDataInTableA(data.someAmountForA);
    saveDataInTableB(data.someAmountForB);
    callAnAggregatedFunction(data);
}

public void saveDataInTableA(DataA a) {
    tableARepository.saveAndFlush(a);
}

public void saveDataInTableA(DataB b) {
    tableBRepository.saveAndFlush(b);
}

public void callAnAggregatedFunction() {
  // Do something based on the data saved from the beginning in Table A and Table B
}
Diğer
JpaRepository ile kullanılan bazı anotasyonlar var.

JPA @NamedQuery Anotasyonu
JpaRepository ile JPA @NamedQuery Anotasyonu yazısına taşıdım

JPA @NamedNativeQuery Anotasyonu
Örnek ver

@Query Anotasyonu
JpaRepository ile @Query Anotasyonu yazısına taşıdım.

Custom Metod
JpaRepository İle Custom Method yazısına taşıdım.

Derived Query
JpaRepository ile Derived Query yazısına taşıdım



Hiç yorum yok:

Yorum Gönder