복붙노트

[SPRING] Spring Data JPA : 예제로 쿼리 하시겠습니까?

SPRING

Spring Data JPA : 예제로 쿼리 하시겠습니까?

Spring 데이터 사용 JPA는 특정 엔티티 인스턴스가 검색 기준으로 사용되는 예제를 통해 쿼리를 수행 할 수 있습니까?

예를 들어 (말장난 없음), 다음과 같은 Person 엔터티가있는 경우 :

@Entity
public class Person {
  private String firstName;
  private String lastName;
  private boolean employed;
  private LocalDate dob;
  ...
}

나는 1977 년 1 월 1 일에 태어난 스미스의 성을 가진 고용 된 모든 사람들을 찾을 수 있었다.

Person example = new Person();
example.setEmployed(true);
example.setLastName("Smith");
example.setDob(LocalDate.of(1977, Month.JANUARY, 1));
List<Person> foundPersons = personRepository.findByExample(example);

해결법

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

    1.Spring 데이터는 Hibernate와 Session이 아닌 JPA와 EntityManager의 상단에 의존하기 때문에 여러분은 findByExample을 즉시 사용할 수 없다. 스프링 데이터 자동 질의 생성을 사용하고 다음 서명을 사용하여 리포지토리에 메소드를 작성할 수 있습니다.

    Spring 데이터는 Hibernate와 Session이 아닌 JPA와 EntityManager의 상단에 의존하기 때문에 여러분은 findByExample을 즉시 사용할 수 없다. 스프링 데이터 자동 질의 생성을 사용하고 다음 서명을 사용하여 리포지토리에 메소드를 작성할 수 있습니다.

    List<Person> findByEmployedAndLastNameAndDob(boolean employed, String lastName, LocalDate dob);
    
  2. ==============================

    2.이제 Spring Data를 사용하여이 작업을 수행 할 수 있습니다. http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example을 확인하십시오.

    이제 Spring Data를 사용하여이 작업을 수행 할 수 있습니다. http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example을 확인하십시오.

    Person person = new Person();                         
    person.setLastname("Smith");                          
    Example<Person> example = Example.of(person);
    List<Person> results = personRepository.findAll(example);
    

    매우 최근의 2016 버전이 필요합니다.

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.10.1.RELEASE</version>       
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>1.12.1.RELEASE</version>
        </dependency>
    

    https://github.com/paulvi/com.example.spring.findbyexample을 참조하십시오.

  3. ==============================

    3.Spring 데이터의 Specification 인터페이스를 사용하여 예제를 통해 쿼리 사용을 근사 할 수있었습니다. 사양을 구현하는 PersonSpec 클래스는 다음과 같습니다. 사양에 의해 반환되는 조건부를 설정하려면 "예제"인력이 필요합니다.

    Spring 데이터의 Specification 인터페이스를 사용하여 예제를 통해 쿼리 사용을 근사 할 수있었습니다. 사양을 구현하는 PersonSpec 클래스는 다음과 같습니다. 사양에 의해 반환되는 조건부를 설정하려면 "예제"인력이 필요합니다.

    public class PersonSpec implements Specification<Person> {
    
      private final Person example;
    
      public PersonSpec(Person example) {
        this.example = example;
      }
    
      @Override
      public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
        List<Predicate> predicates = new ArrayList<>();
    
        if (StringUtils.isNotBlank(example.getLastName())) {
          predicates.add(cb.like(cb.lower(root.get(Person_.lastName)), example.getLastName().toLowerCase() + "%"));
        }
    
        if (StringUtils.isNotBlank(example.getFirstName())) {
          predicates.add(cb.like(cb.lower(root.get(Person_.firstName)), example.getFirstName().toLowerCase() + "%"));
        }
    
        if (example.getEmployed() != null) {
          predicates.add(cb.equal(root.get(Person_.employed), example.getEmployed()));
        }
    
        if (example.getDob() != null) {
          predicates.add(cb.equal(root.get(Person_.dob), example.getDob()));
        }
    
        return andTogether(predicates, cb);
      }
    
      private Predicate andTogether(List<Predicate> predicates, CriteriaBuilder cb) {
        return cb.and(predicates.toArray(new Predicate[0]));
      }
    }
    

    저장소는 간단합니다.

    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
    
    public interface PersonRepository extends JpaRepository<Person, Long>, JpaSpecificationExecutor {}
    

    사용 예 :

    Person example = new Person();
    example.setLastName("James");
    example.setEmployed(true);
    PersonSpec personSpec = new PersonSpec(example);
    List<Person> persons = personRepository.findAll(personSpec);
    
  4. from https://stackoverflow.com/questions/27626825/spring-data-jpa-query-by-example by cc-by-sa and MIT license