복붙노트

[SPRING] Spring 데이터 쿼리 메서드의 선택적 매개 변수

SPRING

Spring 데이터 쿼리 메서드의 선택적 매개 변수

저장소 계층에 몇 가지 쿼리 메서드를 작성하고 싶습니다. 이 메소드는 널 (null) 매개 변수를 무시해야합니다. 예 :

List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam);

이 메소드는 다음 조건으로 Foo를 리턴해야합니다.

bar == barParam && goo == gooParam;

gooParam이 null이 아닌 경우. gooParam이 null 인 경우 조건이 다음으로 변경됩니다.

bar == barParam;

어떤 해결책이 있습니까? 누군가 나를 도울 수 있습니까?

해결법

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

    1.대답 하기엔 너무 늦었 어. Bar와 Goo의 관계에 대해 확실하지 않습니다. Example이 도움이 될 수 있는지 확인하십시오.

    대답 하기엔 너무 늦었 어. Bar와 Goo의 관계에 대해 확실하지 않습니다. Example이 도움이 될 수 있는지 확인하십시오.

    그것은 나를 위해 일했습니다. 비슷한 상황이 있는데 엔티티 사용자가 속성 집합을 가지고 있으며 속성 (선택 사항)을 기반으로 사용자를 검색하는 findAll 메소드가 있습니다.

    예,

      Class User{
        String firstName;
        String lastName;
        String id;
      }
    
      Class UserService{
         // All are optional
         List<User> findBy(String firstName, String lastName, String id){
            User u = new User();
            u.setFirstName(firstName);
            u.setLastName(lastName);
            u.setId(id);
    
            userRepository.findAll(Example.of(user));
            // userRepository is a JpaRepository class
         }
      }
    
  2. ==============================

    2.나는 당신이 질의 정의에 대한 메소드 이름 접근법으로 그렇게 할 수있을 것이라고는 생각하지 않는다. 설명서 (참조)에서

    나는 당신이 질의 정의에 대한 메소드 이름 접근법으로 그렇게 할 수있을 것이라고는 생각하지 않는다. 설명서 (참조)에서

    나는 당신이 여기 상황을 가지고 있다고 생각하기 때문에, 아래의 해답은 @Query 어노테이션 접근법을 사용한다. 이것은 메소드 이름 접근법 (참조)만큼 편리하다.

        @Query("select foo from Foo foo where foo.bar = :bar and "
            + "(:goo is null or foo.goo = :goo)")
        public List<Foo> findByBarAndOptionalGoo(
            @Param("bar") Bar bar, 
            @Param("goo") Goo goo);
    
  3. ==============================

    3.@chaserb의 답을 보완하기 위해 개인적으로 매개 변수를 Java8 Optional 형식으로 추가하여 메서드의 서명에 옵션 필터 인 의미를 명시 적으로 지정했습니다.

    @chaserb의 답을 보완하기 위해 개인적으로 매개 변수를 Java8 Optional 형식으로 추가하여 메서드의 서명에 옵션 필터 인 의미를 명시 적으로 지정했습니다.

    @Query("select foo from Foo foo where foo.bar = :bar and "
       + "(:goo is null or foo.goo = :goo)")
    public List<Foo> findByBarAndOptionalGoo(
         @Param("bar") Bar bar, 
         @Param("goo") Optional<Goo> goo);
    
  4. ==============================

    4.몇 줄에서 코드를 작성할 수 있습니다.

    몇 줄에서 코드를 작성할 수 있습니다.

    List<Foo> findByBarAndOptionalGoo(Bar bar, Goo goo) {
       return (goo == null) ? this.findByBar(bar) : this.findByBarAndGoo(bar, goo);
    }
    

    그렇지 않으면 Spring-Data가이를 지원하는지 여부를 알 수 없습니다.

  5. from https://stackoverflow.com/questions/32728843/spring-data-optional-parameter-in-query-method by cc-by-sa and MIT license