30 Mart 2020 Pazartesi

SpringData JpaRepository ile @Query ve Join + Where In Clause - OneToMany Tarzı İlişkilerde Kullanılır

Giriş
In clause parent child ilişkisi varsa parent tarafına uygulanır.

Örnek
Şöyle yaparız.
public interface FileRepository extends CrudRepository<FileEntity, UUID> {
  @Query("SELECT f FROM FileEntity f JOIN MetadataEntity m on f.id = m.file_id
    WHERE (m.key, m.value) IN (:metadataKeyValue)")
  List<FileEntity> findAllByMetadataContains(@Param("metadataKeyValue")
    Map<String,String> metadataKeyValue);
}
Örnek
Elimizde şöyle bir kod olsun. Bu kod in clause seçimini child tarafına uygulamaya çalışıyor ancak beklenen sonucu vermez.
interface ParentRepo extends JpaRepo<Parent,Integer> {
  @Query("SELECT p FROM Parent p JOIN p.children c WHERE p.id = :parentId ando
          c.id IN(:childIds")
  Parent getParentByIdAndChildIds(int parentId, List<Integer> childIds)
}
Açıklaması şöyle.
My expectation is that calling

parentRepo.getParentByIdAndChildIds(1, Arrays.asList(1,2,3))

will return the parent object with only 3 child entities attached, but instead, I get ALL of the children (i.e. children with ids from 1-10).
Belki sadece child'lara erişmek için şöyle yaparız.
interface ChildRepository extends JpaRepository<Child, Integer> {
  @Query("SELECT c FROM Child c WHERE c.parent.id = :parentId and c.id IN(:childIds)")
  List<Child> getParentByIdAndChildIds(int parentId, List<Integer> childIds)
}

Hiç yorum yok:

Yorum Gönder