[SPRING] Spring Data JPA : 예제로 쿼리 하시겠습니까?
SPRINGSpring 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.Spring 데이터는 Hibernate와 Session이 아닌 JPA와 EntityManager의 상단에 의존하기 때문에 여러분은 findByExample을 즉시 사용할 수 없다. 스프링 데이터 자동 질의 생성을 사용하고 다음 서명을 사용하여 리포지토리에 메소드를 작성할 수 있습니다.
Spring 데이터는 Hibernate와 Session이 아닌 JPA와 EntityManager의 상단에 의존하기 때문에 여러분은 findByExample을 즉시 사용할 수 없다. 스프링 데이터 자동 질의 생성을 사용하고 다음 서명을 사용하여 리포지토리에 메소드를 작성할 수 있습니다.
List<Person> findByEmployedAndLastNameAndDob(boolean employed, String lastName, LocalDate dob);
-
==============================
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.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);
from https://stackoverflow.com/questions/27626825/spring-data-jpa-query-by-example by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 추상 수퍼 클래스에서 스프링 의존성 주입 (0) | 2019.01.02 |
---|---|
[SPRING] spring : 다른 bean의 속성을 읽음으로써 한 bean의 속성을 설정합니까? (0) | 2019.01.02 |
[SPRING] 사용자 권한 부여 된 권한은 항상 : ROLE_ANONYMOUS입니까? (0) | 2019.01.02 |
[SPRING] 의도적으로 Spring 빈을 null로 설정 (0) | 2019.01.02 |
[SPRING] 최대 절전 모드 및 스프링을 사용하여 낙관적 인 잠금 구현 (0) | 2019.01.02 |