13 Aralık 2021 Pazartesi

SpringData JPA @Query Anotasyonu ve Named Parameter

Giriş
Named Parameter Queries  yavaş olabilir. Açıklaması şöyle
The major issue we might face with this parameterised approach is the query performance.The query might run well in your local environment, but suddenly when you start running in Production environment it starts taking too much of time.This is because of the dynamic binding of the parameters to the query by Spring JPA as it cannot determine the data type of the parameter its binding and has to run through all possible types.
@Param Anotasyonu
Java 8'den önce metod parametrelerinin SQL cümlesine atanması için @Param ile işaretli olması gerekir. Yoksa şöyle bir exception fırlatılır.
java.lang.IllegalArgumentException: Name for parameter binding must not be null or empty! For named parameters you need to use @Param for query method parameters on Java versions < 8.
Java 8'den itibaren derleyiciye -parameters seçeneği geçilir.

Eğer metod imzasında fazla parametre varsa exception fırlatılır.
Örnek
Elimizde şöyle bir kod olsun
@Repository
public interface ParentRepository extends JpaRepository<Parent, String> {

  @Query(value = "SELECT c FROM Child c where c.parent.id =:id")  
  public List<Child> findChildById(String id, Example example, Pageable pageable);

}
Exception olarak şunu alırız
Using named parameters for method public abstract 
java.util.List com.example.test.ParentRepository.findChildById
(java.lang.String,org.hibernate.criterion.Example,
 org.springframework.data.domain.Pageable)
but parameter 'Optional[example]' not found in annotated query 
'SELECT c FROM Child c where c.parent.id =:id'!
Örnek - select
Şöyle yaparız.
@Query("select p from Person p where p.name = :name and p.address=:address")
Person withNameAndAddressQuery(@Param("name")String name, @Param("address")String addr);
Örnek - select
Şöyle yaparız.
@Query("select t from TimeTable t where MONTH(t.date) =:month and YEAR(t.date) =:year")
List<TimeTable> findAll(@Param("month") Integer month, @Param("year") Integer year);
Örnek - count
Şöyle yaparız.
public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select count(u) > 0 from User u where u.email = :email")
  Boolean isEmailExist(@Param("email")String email);
}

Hiç yorum yok:

Yorum Gönder