카테고리 없음

[ Spring-Boot ] Data - JPA NamedQuery 사용하기

사과씨앗 2021. 6. 14. 14:37
728x90
반응형

순수 JPA 가 아닌 Data JPA에서 NamedQuery를 사용해 보겠습니다.

 

Data JPA 는 기본적으로 메서드 명으로 쿼리를 구현하여 실행시킨다.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

 

NamedQuery는 Data JPA에서 메서드 명으로 쿼리를 생성하지 않고 직접 쿼리를 구현하여 실행시켜줍니다.

public interface MemberRepository extends JpaRepository<Member,Long> ,MemberRepositoryCustom{
	
    // 메소드 명으로 JPA 를 사용하여 쿼리 실행
    List<Member> findByUsernameAndAgeGreaterThan(String username,int age);

    //쿼리를 직접 구현하여 실행한다.
    @Query("select m from Member m where m.username = :username and m.age = :age")
    List<Member> findUser(@Param("username") String username, @Param("age") int age);
    
    //DTO 로 변환하여 조회 시 아래 쿼리처럼 구현한다.
    @Query("select new study.datajpa.dto.MemberDto(m.Id, m.username, t.name) from Member m join m.team t")
    List<MemberDto> findMemberDto();
    
    
    //count 쿼리를 따로 실행 할 수 있다.
    @Query(value="select m from Member m left join m.team t",
            countQuery = "select count(m.username) from Member m")
    Page<Member> findByAge(int age, Pageable pageable);
    
    
    @Modifying(clearAutomatically = true) //<- update 할 시 꼭 넣어주어야 한다. clearAutomatically = true < 필수 X clear 가 필요할 시
    @Query("update Member m set m.age = m.age+1 where m.age <= :age")
    int bulkAgePlus(@Param("age") int age); 
    
    //컬렉션 타입을 파라미터로 넣어 줄 경우 IN 절을 사용하여 준다.
    @Query("select m from Member m where m.username in :names")
	List<Member> findByNames(@Param("names") List<String> names)
    
    }

 

728x90
반응형