You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@RepositorypublicinterfaceUserRepositoryextendsJpaRepository<User, Long> {
// JPQL 쿼리 예시@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findUsersByName(@Param("name") Stringname);
// Native SQL 예시@Query(value = "SELECT * FROM users WHERE name = :name", nativeQuery = true)
List<User> findUsersByNameNative(@Param("name") Stringname);
}
JPA에서 제공하는 메서드 기반 쿼리로 해결하기 어려운 경우, @Query 어노테이션을 통해 직접 쿼리를 정의하여 사용할 수 있다.
기본적으로 SELECT 작업을 위해 지원하는 어노테이션이다.
JPQL 또는 Native 쿼리를 지원한다.
JPQL(Java Persistence Query Language) : JPA 엔티티 기준으로 작성된 쿼리문
@Transactional@Modifying@Query("UPDATE User u SET u.status = :status WHERE u.id = :id")
intupdateUserStatus(@Param("id") Longid, @Param("status") Stringstatus);
말 그대로 ‘수정’이 일어날 수 있는 쿼리를 뜻하는 것으로, INSERT/UPDATE/DELETE 쿼리 작성 시에 같이 사용해 주어야 한다. @Query 어노테이션과 함께 사용된다.
데이터 수정 작업을 진행하므로, 반드시 트랜잭션 내에서 사용해야 한다.
⚠️ 수정 쿼리인데, @Modifying 안 붙어있으면 에러 발생! -> 쿼리는 실행되더라도, 데이터베이스에 실제로 반영되지 않을 수 있음.)
설정 옵션
@Modifying 어노테이션에는 영속성 컨텍스트 관련하여 2가지 설정(clearAutomatically, flushAutomatically)을 제공한다. 쿼리 실행 전/후에 추가적인 작업이 수행되므로, 성능에 (약간의) 영향을 미칠 수 있다. 따라서 꼭 필요한 경우에만 사용하자.
설정 옵션 1. clearAutomatically
쿼리 실행 후 데이터베이스의 변경사항을 -> 영속성 컨텍스트에 반영(clear)하는 옵션
default : false (영속성 컨텍스트를 초기화하지 않음.)
🚨 @Query 어노테이션을 통해 수행된 쿼리는 영속성 컨텍스트를 거치치 않으므로, clearAutomatically=false인 상태로 @Query 어노테이션을 통해 데이터 업데이트 후 조회 시, '변경이 반영되지 않은', 영속성 컨텍스트에 캐싱된 엔티티가 리턴될 수 있다.
설정 옵션 2. flushAutomatically
쿼리 실행 전 영속성 컨텍스트의 변경사항을 -> 데이터베이스에 반영(flush)하는 옵션
default : false (자동으로 flush 하지 않음.)
🚨 flush 되지 않은 상태에서 쿼리가 실행되면, 영속성 컨텍스트에 남아 있는 변경 사항이 데이터베이스에 반영되지 않을 수 있다.
This discussion was converted from issue #47 on November 24, 2024 11:18.
Heading
Bold
Italic
Quote
Code
Link
Numbered list
Unordered list
Task list
Attach files
Mention
Reference
Menu
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
@Query
어노테이션@Query
어노테이션을 통해 직접 쿼리를 정의하여 사용할 수 있다.SELECT 작업
을 위해 지원하는 어노테이션이다.nativeQuery = true
로 설정)@Query
어노테이션을 통해 데이터가 변경됨을 알 수 없다. ([Spring] JPA 변경 감지(Dirty Checking) #54)@Modifying
어노테이션@Query
어노테이션과 함께 사용된다.@Modifying
안 붙어있으면 에러 발생! -> 쿼리는 실행되더라도, 데이터베이스에 실제로 반영되지 않을 수 있음.)설정 옵션
@Modifying
어노테이션에는 영속성 컨텍스트 관련하여 2가지 설정(clearAutomatically, flushAutomatically)을 제공한다. 쿼리 실행 전/후에 추가적인 작업이 수행되므로, 성능에 (약간의) 영향을 미칠 수 있다. 따라서 꼭 필요한 경우에만 사용하자.설정 옵션 1. clearAutomatically
쿼리 실행 후
데이터베이스의 변경사항을 -> 영속성 컨텍스트에 반영(clear)하는 옵션@Query
어노테이션을 통해 수행된 쿼리는 영속성 컨텍스트를 거치치 않으므로, clearAutomatically=false인 상태로@Query
어노테이션을 통해 데이터 업데이트 후 조회 시, '변경이 반영되지 않은', 영속성 컨텍스트에 캐싱된 엔티티가 리턴될 수 있다.설정 옵션 2. flushAutomatically
쿼리 실행 전
영속성 컨텍스트의 변경사항을 -> 데이터베이스에 반영(flush)하는 옵션Beta Was this translation helpful? Give feedback.
All reactions