작성
·
282
·
수정됨
0
제가 하려는 것은 클라이언트로부터 select 쿼리문이 날아오면 조회해서 반환하는 기능을 구현하고 있습니다.
리스트 형식으로 반환할때 결과값만 반환하지 않고 json 으로 컬렴명 : 결과값 형식으로 반환하고 싶습니다.
하지만 컬렴명을 가져오는 것에서 막혀서 진행이 안 되고 있습니다. 어떻게 하면 entity manager에서 컬럼명을 가져 올 수 있을까요 ?
다음은 repository 클래스 코드 입니다 .
public ArrayList<Object> multiSelectQuery(String queryStr){
try {
Query query = em.createNativeQuery(queryStr);
return (ArrayList<Object>)query.getResultList();
}catch (Exception e){
return null;
}
}//컬럼명 없이 native query 조회하는 코드
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);
}
위 코드는 제가 시도해본 것. (Exception error (Could not unwrap this) 발생합니다.)
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
님의 문제를 해결하기 위해서는 ResultSet에서 컬럼 명을 가져오는 방법이 필요하나, EntityManager의 createNativeQuery
로 반환받은 Query
객체에서는 직접적으로 ResultSet을 얻어내는 것이 지원되지 않습니다. 일반적으로 JPA를 사용할 때는 entity와 매핑하여 결과를 가져오지만, 컬럼명과 값을 직접 가져오고 싶으시다면 JPA가 아닌 순수 JDBC의 Connection
, PreparedStatement
그리고 ResultSet
을 사용하여 구현해야 합니다.
그러나 직접적으로 JDBC API를 사용하는 대신 Query
객체를 unwrap
메서드를 통해 원하는 타입으로 변환하는 방법을 사용하고 계신 것 같은데, Hibernate를 사용하는 경우에는 아래와 같은 방식으로 해결이 가능합니다.
List<Object[]> results = entityManager.createNativeQuery(sql).getResultList();
entityManager.createNativeQuery(sql).unwrap(org.hibernate.query.Query.class).getResultStream().forEach(row -> {
Object[] rowArray = (Object[]) row;
for (Object columnValue : rowArray) {
// 여기서 columnValue를 적절히 처리합니다.
}
});
위의 코드는 Hibernate의 Query
를 사용하여 각 행의 값을 순회하는 예시이므로, 앞서 언급했듯이 Hibernate가 아닌 다른 JPA 구현체를 사용하는 경우 해당 방식으로는 작동하지 않을 수 있습니다.
참고하셔서 문제를 해결하시길 바랍니다.
답변감사합니다. 결국 JdbcTemplate 써서 해결은 했네요 .... unwrap저건 자꾸 빨간 밑줄나오고 마지막에 하긴 했어도 조회된 row순서랑 컬렴명의 순서랑 일치하지가 않아서요.