• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

JPQL 숫자 연산 함수 관련해서 문의드립니다.

24.03.07 06:44 작성 조회수 68

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

COUNT(*) 함수를 사용해서 Member의 수를 카운트 하는 테스트를 했는데, 반환 타입을 Integer로 넣어서 Integer가 나올 것으로 기대했으나 IillegalArugumentException이 발생했습니다.

문제는 아래 쿼리에서 컴파일 오류가 발생하지 않았다는 점인데, 실제로 실무에서는 SELECT절 함수를 통한 값을 얻어 올 때 어떻게 사용하는지 궁금합니다.

예를 들어 타입드 쿼리 대신 Query를 사용해 Object를 받아 인티저 타입으로 캐스팅한다던지, 함수가 반환하는 명확한 타입을 모두 알고 사용해야 하는 것인지, 또는 위 문제를 해결 할 수 있는 다른 방법이 있는지 알려주실 수 있나요 ?

 

TypedQuery<Integer> query1 = em.createQuery("SELECT count(m) from Member m", Integer.class);

답변 2

·

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2024.03.07

안녕하세요. seongchan hwang님, 공식 서포터즈 y2gcoder입니다.

보통은 공식문서(JPA, 하이버네이트)에서 반환 타입의 정보를 얻어오는 편입니다!
하이버네이트 - 집계함수(클릭)

 

말씀하셨듯이 보통은 일일이 찾아가면서 반환 타입 지정해주고 사용하는 것이 불편해서인지 Spring Data JPA나 QueryDSL은 count 와 같이 자주 사용하는 집계함수는 따로 메서드를 만들어 놓았기 때문에 반환타입을 고민할 필요 없이 사용할 수 있습니다

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.07

안녕하세요, 인프런 AI 인턴입니다. seongchan hwang님의 질문 주셔서 감사합니다.

JPQL에서 COUNT 같은 집계 함수를 사용할 때 반환 타입이 Long으로 예상되는 경우에 Integer 타입으로 받으려고 하면 IllegalArgumentException이 발생할 수 있습니다. 다른 사용자들이 COUNT 함수를 사용하면서 겪었던 문제와 관련해서 JPA 사양을 따르는 방식으로 처리하면 좋을 것 같습니다.

다음은 비슷한 상황에서 토의된 내용들과 반환 타입에 대한 질문과 답변 사례입니다.

  • JPA Count 쿼리 Return 값 - 이 경우 count 쿼리의 반환 값이 왜 Long 타입으로 반환되는지에 대한 질문과 그에 대한 답변이 있습니다. 예를 들어 TypedQuery<Long> countQuery = em.createQuery("SELECT count(m) FROM Member m", Long.class);와 같은 형식으로 사용됩니다.

  • 선생님 함수 타입 질문입니다. - 질문자는 JPQL 기본 함수들의 반환형을 어떻게 확인할 수 있는지에 대해 질문하였고, TypedQuery<Long>를 사용하면 된다는 답변이 제공되었습니다.

위의 내용을 바탕으로 JPQL SELECT count(m) 구문은 Long 타입을 반환하므로, 해당 코드를 수정할 때는 TypedQuery<Long>를 사용해야 합니다. 예를 들면 다음과 같은 방식입니다.

TypedQuery<Long> query = em.createQuery("SELECT count(m) from Member m", Long.class);
Long countResult = query.getSingleResult(); // 타입이 Long이므로 Integer로 캐스팅하지 않습니다.

COUNT 함수의 반환 값이 항상 Long 타입으로 정의된 이유는 JPA 사양에서 그렇게 정의하고 있기 때문입니다. 집계 함수들이 큰 수를 반환할 가능성이 있기 때문에, JPA는 Long 타입을 사용하여 보다 넓은 범위의 숫자 처리를 지원합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.