WEB/Spring

JPA (Java Persistence API )

노랑파랑 2017. 4. 21. 20:48
반응형




JPA란

- Java 진영의 ORM(Oriented Relational Mapping)표준 기술

- 범용 기술로 만들어졌기 때문에 Java EE와 SE환경 어디서도 사용 가능하다.

- Java EE 5.0 어노테이션을 사용하여 Java 객체에서 RDB로 Mapping하는 방법을 단순화 시켰다.


※ ORM : 데이터베이스와 객체 지향 프로그래밍 언어간 호환되지 않은 데이터를 변환하는 프로그래밍 기법이다.

따라서 OOP와 RDBMS 중간에서 소통을 위해 통역기 역할을 해주기 때문에 개발자는 OOP 개발에 더욱 집중할 수 있게되고

RDBMS 는 상대적으로 덜 고려해도 된다.

※ RDB : 관계형 데이터베이스. 키(Key)-값(Value)의 쌍으로 이루어진 관계를 테이블화 시킨 전산 정보 데이터베이스





JPA 의존성 추가

- Maven

<dependencies>

    <dependency>

        <groupId>org.springframework.data</groupId>

        <artifactId>spring-data-jpa</artifactId>

        <version>1.11.1.RELEASE</version>

    </dependency>

</dependencies>

- Gradle

dependencies {

    compile 'org.springframework.data:spring-data-jpa:1.11.1.RELEASE'

}






Query 메소드

-쿼리 생성

메소드 이름으로 쿼리 생성

* 예

public interface UserRepository extends Repository<User, Long>{

List<User> findByNameAndAddress(String name, String address)

}

위의 메소드 쿼리는 다음과 같이 변환된다.

SELECT u FROM User u WHERE u.name =?1 AND u.address=?2


* 지원되는 키워드

KeywordSampleJPQL 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<Age> ages)

… where x.age in ?1

NotIn

findByAgeNotIn(Collection<Age> age)

… 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)


- NamedQuery

1. XML

* <named-query/> 요소를 META-INF내의 orm.xml JPA 설정 파일에 작성한다.

<named-query name="User.findByName>

<query>SELECT u FROM User u WHERE u.name=?1</query>

</named-query>


2. 어노테이션 설정

* 다른 설정 파일이 필요하지 않고 Entity 클래스에서 설정할 수 있습니다.

@Entity

@NamedQuery(name = "User.findByName", query="SELECT u FROM User u WHERE u.name =?1")

public class User{ 

...

}




- @Query

* Query 어노테이션은 위의 NamedQuery에 비해 우선순위가 높다.


1. 쿼리 선언

public interface UserRepository extends Repository <User, Long>{


@Query("SELECT u FROM User u WHERE u.name = ?1")

List<User> findByName(String name);

}



2. like

* Like 구분 문자 %가 인식 되면서 유효한 JPQL(%가 삭제하면서)로 변형되는 쿼리가 됩니다. 쿼리 실행 동안 메소드로 전달된 파라미터가 LIKE 아규먼트가 됩니다.

@Query("SELECT u FROM User u WHERE u.name like %?1")

List<User> findByNameEndsWith(String name);



3. 네이티브 쿼리 선언

* 네이티브 SQL은 오라클 SQL등과 같은 데이터 소스가 사용하는 SQL이다. 특정 DBMS가 제공하는 기능을 사용하기 위해 네이티브 SQL을 지원한다.

* 해당 선언으로 네이티브 쿼리의 실행을 허용한다.

@Query(value="SELECT * FROM USER WHERE NAME =?0", nativeQuery=true)

List<User> findByName(String name);



4. named parameter 사용

* @Param 어노테이션을 사용해 메소드의 파라미터에 구체적인 이름을 주고 해당 이름으로 바인딩하게 한다.

@Query("SELECT u FROM User u WHERE u.name = :name OR u.address = :address")

List<User> findByNameOrAddress(@Param("address") String address, @Param("name") String name);


반응형

'WEB > Spring' 카테고리의 다른 글

HandlerMethodArgumentResolver  (0) 2017.02.01
@Controller  (1) 2017.01.30
Spring Boot : Bootstrap 연결  (0) 2017.01.20
Spring Boot에서 Jsp 사용  (0) 2017.01.20
Spring Boot  (0) 2017.01.20