33. Spring JdbcTemplate
public Member findOne(Long id) {
String sql = "select MEMBER_ID as id, USERNAME, PHONE_NUMBER from MEMBER where id = ?";
Member member = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Member>(), id);
return member;
}
35. Spring + JPA
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em; //컨테이너 주입
public Long save(Member member) {
em.persist(member);
return member.getId();
}
...
43. 메서드 이름으로 쿼리생성
public interface MemberRepository extends Repository<Member, Long> {
List<User> findByEmailAndName(String email, String name);
}
[생성된 JPQL]
select m from Member m
where m.email = ?1
and m.name = ?2
44. 메서드 이름으로 NamedQuery 호출
[XML에 작성한 NamedQuery]
<named-query name="User.findByLastname">
<query>select u from User u where u.lastname = ?1</query>
</named-query>
[어노테이션으로 작성한 NamedQuery]
@Entity
@NamedQuery(name = "User.findByEmailAddress",
query = "select u from User u where u.emailAddress = ?1")
public class User {
}
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastname(String lastname);
User findByEmailAddress(String emailAddress);
}
45. @Query
[인터페이스에 쿼리작성 가능]
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}
[JPA 네이티브 쿼리 지원]
public interface UserRepository extends JpaRepository<User, Long> {
}
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?0", nativeQuery = true)
User findByEmailAddress(String emailAddress);
46. @Modifying
[수정 쿼리도 직접 정의 가능]
@Modifying(clearAutomatically = true)
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
85. JPQL 묵시적 조인
[JPQL]
select o.member.team
from Order o
where o.product.name = 'productA' and o.address.city = 'JINJU'
[실행된 SQL]
select t.*
from Orders o
inner join Member m on o.member_id=m.id
inner join Team t on m.team_id=t.id
inner join Product p on o.product_id=p.id
where p.name='productA' and o.city='JINJU'
86. JPA 기본 로딩 전략
•@OneToMany : 기본값=지연로딩(LAZY)
•@ManyToOne : 기본값=즉시로딩(EAGER)