jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

Spring

[에러] Interface 기반 DTO Projection NULL 에러 원인과 해결 방법

2022. 12. 10. 18:38
package com.academy.certificate.domain;

import java.time.LocalDateTime;


public interface ToBeResidentList {
    Long getResidentSerialNumber();

    String getName();

    LocalDateTime getBirthDate();

    String getGenderCode();
}

Resident 엔티티의 필드 중 주민 일련번호, 이름, 생년월일, 성별 코드를 가지고 오는 DTO Projection이다

 

데이터베이스에서 해당하는 값을 가지고 오는 JPQL 쿼리는 다음과 같았다.

@Query("SELECT r.residentSerialNumber, r.name, r.birthDate, r.genderCode " +
        "from Resident as r " +
        "INNER JOIN HouseholdCompositionResident hc on hc.pk.residentSerialNumber = r.residentSerialNumber " +
        "WHERE hc.pk.householdSerialNumber= ?1")
@Transactional
List<ToBeResidentList> getCompositionResidentList(Long householdSerialNumber);

해당 쿼리를 날리면 크기가 4인 리스트가 반환이 됐다. MySql에서도 네 개의 값이 찾아지니까 값을 제대로 찾기는 하는데, 안에 들어 있는게 다 null이었다. 

 

알고보니 select 문안에 항목들과 ToBeResidentList 인터페이스 안 항목들이 매핑이 안되어서 생긴 문제였다.

 

as 를 붙여서 이름을 명시해주니 해결되었다.

@Query("SELECT r.residentSerialNumber as residentSerialNumber, r.name as name, r.birthDate as birthDate, r.genderCode as genderCode " +
        "from Resident as r " +
        "INNER JOIN HouseholdCompositionResident hc on hc.pk.residentSerialNumber = r.residentSerialNumber " +
        "WHERE hc.pk.householdSerialNumber= ?1")
@Transactional
List<ToBeResidentList> getCompositionResidentList(Long householdSerialNumber);
    'Spring' 카테고리의 다른 글
    • RestTemplate get 비교 시 객체 처리
    • Spring Boot에서 RestTemplate 빈 등록을 해야할까?
    • [스프링 시큐리티] 사용자 관리 UserDetails, UserDetailsService, UserDetailsManager
    • [스프링 시큐리티] 스프링 시큐리티의 흐름

    티스토리툴바