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

허당더기님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

네이티브 쿼리

실행된 Query의 결과에 포함된 컬럼명을 확인 할 수 있을까요?

작성

·

985

·

수정됨

0

안녕하세요.
지금은 안쓰는 JDBC는 ResultSet.getMetaData()를 통해 컬럼명, 타입을 가져올 수 있었는데, EntityManager를 사용하는 경우 Query의 컬럼명을 확인할 수 있는지 궁금합니다.

(질문참고) https://m.blog.naver.com/heoguni/130170563284

 

감사합니다.

답변 4

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 허당더기님

다음과 같이 map으로 조회하는 방법이 있습니다.

jpql = "SELECT new map(e.column1 as column1, e.column2 as column2) FROM EntityClass e";
TypedQuery<Map<String, Object>> query = entityManager.createQuery(jpql, Map.class);
List<Map<String, Object>> result = query.getResultList();

for (Map<String, Object> row : result) {
    String column1Value = row.get("column1").toString();
    String column2Value = row.get("column2").toString();
}

 

Native SQL 쿼리를 사용하는 경우는 다음과 같습니다.

sql = "SELECT column1, column2 FROM entity_table";
Query query = entityManager.createNativeQuery(sql);
List<Object[]> result = query.getResultList();

for (Object[] row : result) {
    String column1Value = row[0].toString();
    String column2Value = row[1].toString();
}

이 방법을 사용하면 Object[] 형태로 결과가 반환되며, 각 컬럼의 값을 배열 인덱스를 사용하여 접근할 수 있습니다.

query = entityManager.createNativeQuery(sql);
List<Object[]> result = query.getResultList();
ResultSet resultSet = query.unwrap(java.sql.ResultSet.class);
ResultSetMetaData metaData = resultSet.getMetaData();

for (int i = 1; i <= metaData.getColumnCount(); i++) {
    String columnName = metaData.getColumnName(i);
    System.out.println("Column " + i + ": " + columnName);
}

 

순수한 엔티티를 조회하는 경우에는 DB 컬럼명을 조회하기는 어렵고, 대신에 자바 객체의 필드명을 조회할 수 있습니다.

Metamodel metamodel = em.getMetamodel();
EntityType<EntityA> entityType = metamodel.entity(EntityA.class);
Set<Attribute<? super EntityA, ?>> attributes = entityType.getAttributes();
for (Attribute<? super EntityA, ?> attribute : attributes) {
    String name = attribute.getName();
    System.out.println("name = " + name);
}

 

감사합니다.

허당더기님의 프로필 이미지
허당더기
질문자

친절한 설명 감사합니다.

0

허당더기님의 프로필 이미지
허당더기
질문자

안녕하세요.
Native SQL을 사용하는데
Query query = entityManager.createNativeQuery(sql); List<Object[]> result = query.getResultList(); ResultSet resultSet = query.unwrap(java.sql.ResultSet.class);
하면 에러가 발생하네요.
--에러--
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: Could not unwrap this [org.hibernate.query.internal.NativeQueryImpl@4c9ed40] as requested Java type [java.sql.ResultSet]

0

허당더기님의 프로필 이미지
허당더기
질문자

안녕하세요.
답변 감사합니다.
죄송하지만 log를 보려는게 아니라, api에서 결과 데이터와 함께 제공하고 싶어서요

0

안녕하세요. 허당더기님, 공식 서포터즈 OMG입니다.
.

질문 내용이 jpa의 show-sql 설정으로 해결되지 않나요?

https://lannstark.tistory.com/14
해결이 안된다면 show-sql을 true로 했을 때와의 차이를 알려주시면 답변에 도움이 될 것 같습니다.

.
감사합니다.