복붙노트

[SPRING] Spring 데이터 쿼리에서 자식 객체 필터링

SPRING

Spring 데이터 쿼리에서 자식 객체 필터링

다음 도메인 모델이 있습니다.

재생 목록 -> 목록 -> 비디오

@Entity
class Playlist{
   // id, name, etc
   List<PlaylistItem> playlistItems;
   // getters and setters
}


@Entity
class PlaylistItem{
   // id, name, etc.
   Video video;
   // getters and setters
}


@Entity
class Video{
   // id, name, etc.
   boolean isDeleted;
   // getters and setters
}

그리고 내 저장소 :

public interface PlaylistRepository extends JpaRepository<Playlist, Long> {
   List<Playlist> findAll();
}

이제 기존 비디오 만 포함 된 재생 목록을 반환하려면 어떻게해야합니까? 즉, 해당 재생 목록 항목에 할당 된 데이터베이스에 3 개의 비디오가 있고 그 중 하나의 비디오가 isDeleted를 true로 설정 한 경우 대신 두 개의 항목 만 가져와야합니다.

해결법

  1. ==============================

    1.PlaylistRepository 인터페이스에서이 메서드를 선언하면됩니다.

    PlaylistRepository 인터페이스에서이 메서드를 선언하면됩니다.

    List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted);
    

    그리고 이것을 이렇게 부르십시오.

    playListRepository.findByPlaylistItemsVideoIsDeleted(false);
    

    그러면 제거되지 않은 동영상이 포함 된 모든 재생 목록이 반환됩니다.

  2. ==============================

    2.Maksim, 다음과 같이 @query 주석을 사용할 수 있습니다.

    Maksim, 다음과 같이 @query 주석을 사용할 수 있습니다.

    public interface PlaylistRepository extends JpaRepository<Playlist, Long> {
       @Query("select playlist from Playlist playlist 
               fetch join playlist.playlistItems itens
               fetch join itens.video as video
               where video.isDeleted = false")
       List<Playlist> findAll();
    }
    

    또는 더 나은 방법 :

    public interface PlaylistRepository extends JpaRepository<Playlist, Long> {
       @Query("select playlist from Playlist playlist 
               fetch join playlist.playlistItems itens
               fetch join itens.video as video
               where video.isDeleted = :hasVideo ")
       List<Playlist> findPlayList(@Param("hasVideo") boolean hasVideo);
    }
    
  3. ==============================

    3.Spring 데이터 스펙을 살펴볼 수 있습니다. 당신은 repository.findAll (s)를 호출하여 그것들을 사용한다;

    Spring 데이터 스펙을 살펴볼 수 있습니다. 당신은 repository.findAll (s)를 호출하여 그것들을 사용한다;

    사양을 사용하면 추가하려는 필터를 포함하여 쿼리에 임의의 조건을 추가 할 수 있습니다. 사양에 대한 또 다른 좋은 점은 형식이 안전 할 수 있다는 것입니다. 여길 봐:

    http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications

  4. from https://stackoverflow.com/questions/26684361/filter-child-object-in-spring-data-query by cc-by-sa and MIT license