반응형
📝@NamedQuery, @Query
@Entity
@NamedQuery(
name="Member.findByUsername", // Key
query="select m from Member m where m.username = :username" // Value
)
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
}
public interface MemberRepository extends JpaRepository<Member, Long> {
/** ----- 방법1 (@Query) ----- **/
@Query(name ="Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
/** ----- 기본 예제 ----- **/
@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);
}
조건절 조회하는 임의의 쿼리가 필요할 때 Entity에 @NamedQuery를 이용해 JpaRepository에서 {키:값} 형태로 찾아 사용이 가능하다
이 방법보단 JpaRepository에서 바로 @Query를 이용해 바로 작성하는 걸 더 많이 사용한다
📝@Modifying
public interface MemberRepository extends JpaRepository<Member, Long> {
@Modifying(clearAutomatically = true)
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
}
Update한 후에 Update 항목을 조회하는 경우가 있을 때 영속성 컨텍스트 캐시를 날리고 데이터 조회하기 때문에 디비에서 조회하게 되고 데이터의 정합성을 맞춘다
📝@EntityGraph
public interface MemberRepository extends JpaRepository<Member, Long> {
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
// 위에 코드는 EntityGraph + Query로 아래와 같은 코드이다. (team Fetch Join)
// @Query("select m from Member m left join fetch m.team")
List<Member> findMemberEntityGraph();
}
패치조인을 더 쉽게할 수 있도록 스프링 데이터 JPA에서 제공해준다.
📝엔터티 라이프 사이클 컨트롤 어노테이션
@PrePersist : 새로운 엔티티에 대해 persist가 호출되기 전
@PreUpdate : 엔티티 업데이트 작업 전
@PreRemove : 엔티티가 제거되기 전
@PostPersist : 새로운 엔티티에 대해 persist가 호출된 후
@PostUpdate : 엔티티가 업데이트된 후
@PostRemove : 엔티티가 삭제된 후
@PostLoad : Select조회가 일어난 직후에 실행
반응형