1. DTO 매핑 오류
Solution
- 정의된 클래스가 아닌 새 DTO에 매핑을 시도할 경우, 직접 생성자에 값을 넣어서 매핑해야 함.

public AccountResponse.TransferUserDTO detail1(int number) {
String sql = """
select
at.balance account_balance,
at.number account_number,
ut.fullname account_owner
from account_tb at
inner join user_tb ut
on at.user_id = ut.id
where at.number = ?
""";
Query query = em.createNativeQuery(sql);
query.setParameter(1, number);
Object[] result = (Object[]) query.getSingleResult();
AccountResponse.TransferUserDTO dto = new AccountResponse.TransferUserDTO(
((Number) result[1]).intValue(), // account_number
((Number) result[0]).intValue(), // account_balance
(String) result[2] // account_owner
);
return dto;
}
AccountResponse.TransferListDTO detail =
new AccountResponse.TransferListDTO(
(String) obs[0],
((Number) obs[1]).intValue(),
((Number) obs[2]).intValue(),
((Number) obs[3]).intValue(),
((Number) obs[4]).intValue(),
(String) obs[5]
);
2. Builder 매핑 오류
Solution
- EntityManager에서 제공하는 NativeQuery를 사용하면, DB에서 반환하는 raw 타입을 그대로 받음
- 해당 DB에서 반환 타입이 어떻게 나오는지 확인해보는 것이 좋음.
System.out.println("createdAt type: " + obs[4].getClass().getName());
- 보통 String일 경우가 높고, Timestamp는 String으로의 명시적 형 변환이 불가함.
- Timestamp.valueOf()를 사용해야 함.
- User 클래스 자체를 받아온다면, NativeQuery + Entity 매핑을 사용하는 것이 좋음.
Query q = em.createNativeQuery("SELECT * FROM user_tb WHERE username = ?", User.class);
q.setParameter(1, user.getUsername());
User foundUser = (User) q.getSingleResult();
Share article