인프런 커뮤니티 질문&답변

sungwoo님의 프로필 이미지
sungwoo

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 JdbcTemplate

jdbcTemplate 동적쿼리 질문입니다.

작성

·

1.5K

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요. 강의 2회독 중에 궁금한점이 생겨서 질문을 남깁니다.
조회조건이 하나(name 또는 id)인 케이스에 대해서만 강의해주셨는데요.
만약 조회조건이 여러개가 조합될수고 조회조건이 반드시 넘어오지 않을수도 있는 케이스에 대해서는 어떻게 처리 할 수 있나요?
예를 들어보면...
케이스1) 이름이 spring 이면서 나이가 20살인 Member 조회
케이스2) 이름이 spring 인 Member 조회 (나이 조건은 전달되지 않음)
케이스3) 나이가 20인 Member 조회 (이름 조건은 전달되지 않음)
위 3가지 케이스를 하나의 메소드로 처리하기 위해 아래와 같이 쿼리문 작성시 작성하려고 했습니다.
jdbcTemplate.query("select * from member where id=? and name=?", memberRowMapper(), id, name);
하지만 이런 명령으로는 케이스1만 처리가 가능하고.
케이스2, 3 같이 이름 또는 나이가 전달되지 않았을때, where 절의 id 또는 name 중 하나만 생겨야 하고, 3번째, 4번째 파라미터도 둘중 하나만 있도록 구현해야 될거 같은데 방법을 잘 모르겠습니다.
질문이 두서없고 장황하였지만...
결국 jdbcTemplate.query를 상황에 따라 동적으로 사용하는 방법이 궁금합니다.
myBatis, JPA, queryDsl 등을 사용하지 않고, 반드시 jdbcTemplate 을 사용해서 해결하고 싶다면 어떻게 처리할 수 있을까요?

답변 2

3

sungwoo님의 프로필 이미지
sungwoo
질문자

감사합니다. 댓글 참조하여 다음과 같이 작성해보았습니다.

public Optional<Member> findByIdOrName(Long id, String name) {
StringBuilder query = new StringBuilder("select * from member where 1=1");
List<String> queryArgs = new ArrayList<>();

if(id != null) {
query.append(" and id=?");
queryArgs.add(String.valueOf(id));
}
if(name != null) {
query.append(" and name=?");
queryArgs.add(name);
}

List<Member> result = jdbcTemplate.query(query.toString(), memberRowMapper()
, queryArgs.toArray());

return result.stream().findAny();
}

0

안녕하세요. aq14 님, 공식 서포터즈 codesweaver 입니다.

.

해당 조건들을 만족하기 위해선 '동적 쿼리'라고 하는 키워드로 검색하시면 많은 도움을 얻으실 수 있습니다. 가장 고전적인 방법은 파라미터의 존재 여부를 체크하여 존재시 String 을 계속 이어 붙이는 방법입니다. 아래의 링크를 참조하시면 String을 이어붙이며 해결하는 코드를 살펴보실 수 있습니다.

db2 - JbdcTemplate - PreparedStatements with Dynamic SQL Query - Stack Overflow

.
감사합니다.

sungwoo님의 프로필 이미지
sungwoo

작성한 질문수

질문하기