12장 스프링 데이타 JPA
스프링 데이타 JPA 기능 학습 및 적용
소개 스프링 데이타 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트다. 이 프로젝트는 데이터 접근 계층을 개발할 때 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결한다. 우선 CRUD를 처리하기 위한 공통 인터페이스를 제공한다. 그리고 리포지토리를 개발할 때 인터페이스만 작성하면 실행 지점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입해준다. 따라서 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있다.
환경설정
- 라이브러리 설정
<groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.8.0.RELEASE</version> </dependency>
- 환경설정
<jpa:repositories base-package="jpabook.jpashop.repository"/>
스프링 데이타 JPA는 간단한 CRUD 기능을 공통으로 처리하는 JpaRepository 인터페이스를 제공한다.
public interface JapRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>{ ... }
public interface MemberRepository extends JpaRepository<Member, Long>{}
스프링 데이타 JPA 쿼리 메소드 기능
public interface MemberRepository extends Repository<Member, Long> {
List<Member> findByEmailAndName(String email, String name);
}
select m from Member m where m.email=?1 and m.name=?2
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstname,findByFirstnameIs,findByFirstnameEquals | … where x.firstname = 1? |
Between | findByStartDateBetween | … where x.startDate between 1? and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age ⇐ ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection |
… where x.age in ?1 |
NotIn | findByAgeNotIn(Collection |
… where x.age not in ?1 |
True | findByActiveTrue() | … where x.active = true |
False | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
- 스프링 데이터 모듈
- Repository, CrudRepository, PagingAndSortingRepository
- 스프링 데이타 JPA
- 스프링 데이터 모듈에 추가로 JPA에 특화된 기능을 제공한다.
http://docs.spring.io/spring-data/jpa/docs/1.8.0.RELEASE/reference/html/#project
- 스프링 데이타 JPA와 QueryDSL 통합
org.springframework.data.querydsl.QueryDslPredicateExecutor org.springframework.data.querydsl.QueryDslRepositorySupport
RM Repository
- commons-data-1.0.1-SNAPSHOT 사용
import com.rsupport.commons.data.GenericRepositoryJpa;
public interface ConferenceRepository extends GenericRepository<Conference, String> {
@Repository("conferenceRepository")
public class ConferenceRepositoryJpa extends GenericRepositoryJpa<Conference, String> implements ConferenceRepository {
public ConferenceRepositoryJpa() {
super(Conference.class);
}
@Override
public List<ConferenceEndpoint> getByConferenceId(String id) {
JPAQuery query = new JPAQuery(getEntityManager());
QConference qConference = QConference.conference;
QConferenceEndpoint qConferenceEndpoint = QConferenceEndpoint.conferenceEndpoint;
QEndpoint qEndpoint = QEndpoint.endpoint;
query.from(qConference).innerJoin(qConference.conferenceEndpoints, qConferenceEndpoint)
.join(qConferenceEndpoint.endpoint, qEndpoint).where(qConference.id.eq(id));
query.orderBy(qConferenceEndpoint.updatedDt.asc());
- dependency querydsl 3.4.1
<dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-sql</artifactId> <version>${querydsl.version}</version> <exclusions> <exclusion> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-sql-codegen</artifactId> <version>${querydsl.version}</version> </dependency>