JpaRepository reference 요약

2017. 7. 2. 22:07Project/[Java] Spring Boot - 좌석 관리 시스템

#CRUD 機能

 

public interface CrudRepository<T, ID extends Serializable>
   
extends Repository<T, ID> {

   
<S extends T> S save(S entity); (1)

    T findOne(ID primaryKey);       (2)
   
Iterable<T> findAll();          (3)
   
Long count();                   (4)    
    void delete(T entity);          (5)
    boolean exists(ID primaryKey);  (6)
    // … more functionality omitted.


} 

 

   

1) 엔티티 저장

2) ID로 엔티티 찾아 반환

3) 모든 엔티티 return

4) 엔티티의 숫자 return

5) 주어진 엔티티 삭제

6) ID로 엔티티 존재여부 return

 

#PAGING 기능

 

public interface PagingAndSortingRepository<T, ID extends Serializable>
 
extends CrudRepository<T, ID> {

 
Iterable<T> findAll(Sort sort);

 
Page<T> findAll(Pageable pageable);
}

 

예제) 20페이지 짜리

 

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));

 

 

#create query by methodName

 

 

public interface PersonRepository extends Repository<User, Long> {
 

  // 이메일주소와 이름을 조건으로 select
 
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

 
// 쿼리에 distinct 적용하기
 
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
 
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);


 
// Enabling ignoring case for an individual property
 
List<Person> findByLastnameIgnoreCase(String lastname);
 
// Enabling ignoring case for all suitable properties
 
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

 
// ORDER BY 적용
 
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
 
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

 

plus) Between, LessThan, GreaterThan, Like와 같은 연산자도 사용 가능

 

# 쿼리문에 paging과 sort, slice(?)를 사용

 

Page<User> findByLastname(String lastname, Pageable pageable);

Slice<User> findByLastname(String lastname, Pageable pageable);

List<User> findByLastname(String lastname, Sort sort);

List<User> findByLastname(String lastname, Pageable pageable);

 

# 쿼리 결과를 limit

 

//이름이 알파벳 a에 가까운 1명 

User findFirstByOrderByLastnameAsc();
//나이가 가장 많은 1명
User findTopByOrderByAgeDesc();
//이름이 a에 가까운 10명(페이지 return) 
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
//이름이 a에 가까운 3명(slice return)
Slice<User> findTop3ByLastname(String lastname, Pageable pageable);
//이름이 a에 가까운 10명(list return)
List<User> findFirst10ByLastname(String lastname, Sort sort);
List<User> findTop10ByLastname(String lastname, Pageable pageable);

 

# jpa repository에서 지원하는 메소드명

 

http://arahansa.github.io/docs_spring/jpa.html 참고

 

<Custom Query 사용>

 

# namedQuery(엔티티에서 annotation > repository에서 선언) 사용할 경우

 

User 엔티티.java

 

@Entity
@NamedQuery(name = "User.findByEmailAddress",
  query
= "select u from User u where u.emailAddress = ?1")
public class User {

}

 

UserRepository.java

 

public interface UserRepository extends JpaRepository<User, Long> {

 
List<User> findByLastname(String lastname);

 
User findByEmailAddress(String emailAddress);
}

 

 

# @Query 사용할 경우

 

public interface UserRepository extends JpaRepository<User, Long> {

 
@Query("select u from User u where u.firstname like %?1")
 
List<User> findByFirstnameEndsWith(String firstname);
}

 

# DB에서 쓰던 SQL문 사용하고 싶다면?

nativeQuery =true를 붙여준다.

 

public interface UserRepository extends JpaRepository<User, Long> {

 
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?0", nativeQuery = true)
 
User findByEmailAddress(String emailAddress);
}

 

 

# annotation for parameter binding

 

public interface UserRepository extends JpaRepository<User, Long> {

 
@Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
 
User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                
@Param("firstname") String firstname);
}

 

<Update Query 사용>

 

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

 

 

<transaction 쿼리에 적용하기>

 

@Transactional(readOnly = true)
public interface UserRepository extends JpaRepository<User, Long> {
 
List<User> findByLastname(String lastname);

 
@Modifying
 
@Transactional
 
@Query("delete from User u where u.active = false")
 
void deleteInactiveUsers();


}

 

 

 

 

 

'Project > [Java] Spring Boot - 좌석 관리 시스템' 카테고리의 다른 글

Thymeleaf 復習  (0) 2017.07.02