CrudRepository 인터페이스를 상속 받은 인터페이스 Repository쿼리 메서드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나로 Repository 인터페이스에 간단한 네이밍 룰을 이용하여 메서드를 작성하면 원하는 쿼리를 실행할 수 있습니다.
.
쿼리메서드를 이용할 때 가장 많이 사용하는 문법으로 find를 사용합니다. 엔티티의 이름은 생략이 가능하며, By 뒤에는 검색할 때 사용할 변수의 이름을 적어줍니다.
implementation 'org.springframework.data:spring-data-jdbc:3.3.1'
@Configuration
@EnableTransactionManagement
@MapperScan("org.choongang")
@EnableJdbcRepositories("org.choongang")
public class DBConfig extends AbstractJdbcConfiguration {
@Bean
public NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource){
return new NamedParameterJdbcTemplate(dataSource);
}
}
CrudRepository는 제네릭으로 되어있기 때문에 기본키가 되는 값은 반드시 java.lang변수로 설정해야한다.
@Data
@Builder
@NoArgsConstructor @AllArgsConstructor
public class Member {
@Id //기본키 설정
private Long seq;
private String email;
private String password;
private String userName;
private LocalDateTime regDt;
}
키값조회가 아닌 다른값으로 조회를 위해 쿼리메서드를 선언할 수 있다.
public interface MemberRepository extends CrudRepository<Member, Long> {
Member findByEmail(String email);
List<Member> findByUserNameContaining(String keyword);
List<Member> findByUserNameContainingAndEmailContainingOrderByRegDtDesc(String ke1, String key2);
}
@SpringJUnitWebConfig
@ContextConfiguration(classes = MvcConfig.class)
public class MemberRepositoryTest {
@Autowired
private MemberRepository repository;
@Test
void test1(){
List<Member> members = (List<Member>) repository.findAll();
members.forEach(System.out::println);
}
@Test
void test2(){
Member member = Member.builder()
.seq(1L)
.email("user01@test.org")
.password("12345678")
.userName("사용자06(수정)")
.build();
repository.save(member);
}
@Test
void test3(){
Member member = repository.findById(1L).orElse(null);
System.out.println(member);
repository.delete(member);
}
@Test
void test4(){
Member member = repository.findByEmail("user02@test.org");
System.out.println(member);
}
@Test
void test5(){
List<Member> members =repository.findByUserNameContaining("용자");
members.forEach(System.out::println);
}
@Test
void test6(){
List<Member> members = repository.findByUserNameContainingAndEmailContainingOrderByRegDtDesc("용자","user");
members.forEach(System.out::println);
}
}
public interface MemberRepository extends CrudRepository<Member, Long> {
@Query("SELECT * FROM MEMBER WHERE USER_NAME LIKE :param1 AND EMAIL LIKE :param2 ORDER BY REG_DT DESC")
List<Member> getMembers(@Param("param1") String key1, @Param("param2") String key2);
}
@SpringJUnitWebConfig
@ContextConfiguration(classes = MvcConfig.class)
public class MemberRepositoryTest {
@Autowired
private MemberRepository repository;
@Test
void test7(){
List<Member> members = repository.getMembers("%용자%", "%user%");
members.forEach(System.out::println);
}
}
@Table : 테이블명을 변경, 클래스명과 테이블명이 일치하지않을경우 사용.@Column :@Data
@Builder
@NoArgsConstructor @AllArgsConstructor
@Table
public class Member {
@Id //기본키 설정
@Column("ID")
private Long seq;
private String email;
private String password;
private String userName;
private LocalDateTime regDt;
}
Pageable 인터페이스
PageRequest 구현 클래스
Page 자료형
public interface MemberRepository extends CrudRepository<Member, Long> {
Member findByEmail(String email);
Page<Member> findByUserNameContaining(String keyword, Pageable pageable);
}
@Test
void test8(){
Pageable pageable = PageRequest.of(0,3);
Page<Member> data = repository.findByUserNameContaining("용자", pageable);
List<Member> members = data.getContent();
long total = data.getTotalElements(); //조회된 전체 레코드 개수
int pages = data.getNumber();
members.forEach(System.out::println);
System.out.println(total + " " + pages);
}
ORDER BY
@Test
void test8(){
//Pageable pageable = PageRequest.of(0,3);
Pageable pageable = PageRequest.of(0, 3, Sort.by(desc("regDt"),asc("email")));
Page<Member> data = repository.findByUserNameContaining("용자", pageable);
List<Member> members = data.getContent();
long total = data.getTotalElements(); //조회된 전체 레코드 개수
int pages = data.getNumber();
members.forEach(System.out::println);
System.out.println(total + " " + pages);
}