inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 DB 2편 - 데이터 접근 활용 기술

JPA 적용1 - 개발

JpaItemRepositoryV1의 findAll() 로직 질문 있습니다

해결된 질문

422

임현석

작성한 질문수 1

1

안녕하세요.
JpaItemRepositoryV1의 findAll() 메소드의 로직 중에
...
if (StringUtils.hasText(itemName) || maxPrice != null) {
        jpql += " where";
}
    boolean andFlag = false;
    List<Object> param = new ArrayList<>();
    if (StringUtils.hasText(itemName)) {
        jpql += " i.itemName like concat('%',:itemName,'%')";
        param.add(itemName);
        andFlag = true;
}
...
이 param이 없어도 테스트 코드가 정상 동작하고, 안쓰는것 같은 느낌이 들어서요,
안쓰는것 맞을까요?

spring

답변 1

1

OMG

안녕하세요. 임현석님, 공식 서포터즈 OMG입니다.

강의 19분 48초 보시면 상품명 검색하는 부분에서 해당 코드가 동작합니다 :)


감사합니다.

0

임현석

정확히 List<Object> param = new ArrayList<>(); 과 param.add(itemName) 이 부분이 JpaRepository 에서는 query.setParameter()로 파라미터값을 넘겨주고 있으니까 필요가 없는것 같아서요, 그건 아닐까요?

0

OMG

if (StringUtils.hasText(itemName)) {
jpql += " i.itemName like concat('%',:itemName,'%')";
param.add(itemName);
andFlag = true;
}
TypedQuery<Item> query = em.createQuery(jpql, Item.class);
if (StringUtils.hasText(itemName)) {
query.setParameter("itemName", itemName);
}

 

이 두개의 코드를 보신 것 같은데요,

두 코드 itemName이 존재할 때, 즉 검색을 이용할 때 동작합니다.

if (StringUtils.hasText(itemName)) 

이 조건을 만족하지 않으면

query.setParameter("itemName", itemName);

를 수행하지 않습니다.

 

TypedQuery<Item> query = em.createQuery(jpql, Item.class);

여기서 query는 jpql 변수로 만드는데, 추가적으로 

if (StringUtils.hasText(itemName)) 

이 조건을 만족해야 if문안의 query.setParameter가 수행됩니다.

0

임현석

    @Override
    public List<Item> findAll(ItemSearchCond cond) {
        String jpql = "select i from Item i";
        Integer maxPrice = cond.getMaxPrice();
        String itemName = cond.getItemName();
        if (StringUtils.hasText(itemName) || maxPrice != null) {
            jpql += " where";
        }
        boolean andFlag = false;
        List<Object> param = new ArrayList<>(); // 여기
        if (StringUtils.hasText(itemName)) {
            jpql += " i.itemName like concat('%',:itemName,'%')";
            param.add(itemName); // 여기
            andFlag = true;
        }
        if (maxPrice != null) {
            if (andFlag) {
                jpql += " and";
            }
            jpql += " i.price <= :maxPrice";
            param.add(maxPrice); // 여기
        }
        log.info("jpql={}", jpql);
        TypedQuery<Item> query = em.createQuery(jpql, Item.class);
        if (StringUtils.hasText(itemName)) {
            query.setParameter("itemName", itemName);
        }
        if (maxPrice != null) {
            query.setParameter("maxPrice", maxPrice);
        }
        return query.getResultList();
    }

음.. 그러면 저는 // 여기 라고 표시해놓은곳이 지워져도 된다고 생각하고, 잘못 들어간 부분이라고 생각하는데, 그건 아닌건가요??

0

OMG

주석으로 위치를 표기해주셔서 이해하였습니다.

param.add를 말씀해주셨는데, jpql 부분에만 신경을 썼네요..

 

네, 해당 코드는 지우셔도 상관없는 코드입니다.

JdbcTemplateItemRepositoryV1 코드를 복사해오는 과정에서 추가된 코드로 보이네요 ^^

JdbcTemplateItemRepositoryV1 여기서는 template에서 쿼리로 param을 넘기기 때문에 필요합니다.

 

  List<Object> param = new ArrayList<>();
        if (StringUtils.hasText(itemName)) {
            sql += " item_name like concat('%',?,'%')";
            param.add(itemName);
            andFlag = true;
        }

        if (maxPrice != null) {
            if (andFlag) {
                sql += " and";
            }
            sql += " price <= ?";
            param.add(maxPrice);
        }

        log.info("sql={}", sql);
        return template.query(sql, itemRowMapper(), param.toArray());

 

0

임현석

아 그렇군요 답변 감사합니다 ^^

설정 정보 없이 임베디드 데이터베이스 생성

0

43

1

RepositoryTest의 패키지 위치가 domain인 이유

0

61

2

REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!

0

50

1

update()에 사용하는 setter 질문드립니다.

0

63

1

SQL 중심적 개발의 문제점에 대한 질문

0

95

1

혹시 Containing 을 안쓰신 이유가 있을까요?

0

96

2

[공유] 스프링부트 4.x 버전 mybatis 연동

0

213

1

@repository 어노테이션

0

111

3

ItemService

0

67

1

논리 커밋, 물리 커밋 질문드립니다.

0

59

1

내부 트랜잭션 커밋은 필수인가요?

0

64

1

프록시 커넥션 객체를 반환할 때 생성하는건가요?

0

63

1

Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)

2

192

2

JPQL 대신 네이티브 쿼리를 사용해야 하는 경우

0

88

1

@EventListener(ApplicationReadyEvent.class) 관련

0

101

1

트랜잭션 동기화 매니저와 데이터 소스

0

83

1

DB 관련 강의 개설 계획은 없으신건가요?

0

141

2

물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요

0

102

1

스프링 3 버전 이상 rollbackFor 변경된듯요

1

125

1

트랜잭션 전파 질문.

0

95

1

프로젝트 오픈 에러

0

139

1

외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다

0

87

2

같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환

0

80

1

h2 인메모리 테스트중 예약어 충돌날 경우 대처방법

0

107

1