JPA의 Query 쿼리 인터페이스를 맵 객체로 되돌리는 방법

2334 단어 JPAQueryMap
JPA 2.0에서 우리는 entity 관리자를 사용할 수 있다.createNativeQuery () 는 원래 SQL 문을 실행합니다.그러나 우리가 검색 결과에 대응하는 실체 클래스가 없을 때query.getResultList()는 List를 반환합니다.즉, 모든 줄의 데이터가 대상 그룹으로 되돌아온다는 것이다.
일반적인 사용법은 다음과 같다.

public void testNativeQuery(){
  Query query = entityManager.createNativeQuery("select id, name, age from t_user");
  List rows = query.getResultList();
  for (Object row : rows) {
    Object[] cells = (Object[]) row;
    System.out.println("id = " + cells[0]);
    System.out.println("name = " + cells[1]);
    System.out.println("age = " + cells[2]);
  }
}
이렇게 사용하면 코드를 이해하기 매우 어려울 것이다. 도대체 아래에 0이라고 표시된 요소가 무엇인지, 조회 문장을 세지 않으면 알 수 없고, 조회 문장이 조정되면 자바 코드도 함께 조정해야 한다.이때 우리는 맵이 되돌아오면 사용이 뚜렷해질 것이라고 생각한다.
안타깝게도 JPA의 API에는 이러한 설정이 제공되지 않습니다.사실 많은 JPA의 밑바닥 실현은 모두 맵 대상으로 돌아가는 것을 지원한다.
예:

EclipseLink query.setHint(QueryHints.RESULT_TYPE, ResultType.Map); 
Hibernate .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
따라서 만약에 우리가 맵으로 돌아가서 밑바닥이 어떤 JPA의 실현을 사용하고 있는지 확인하고자 할 때 우리는 뒤로 물러나서 그 다음을 추구하고 크로스 실현의 특성을 희생하여 우리의 수요를 만족시킬 수 있다.

public void testNativeQuery(){
  Query query = entityManager.createNativeQuery("select id, name, age from t_user");
  query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  List rows = query.getResultList();
  for (Object obj : rows) {
    Map row = (Map) obj;
    System.out.println("id = " + row.get("ID"));
    System.out.println("name = " + row.get("NAME"));
    System.out.println("age = " + row.get("AGE"));
  }
}
Query 반환 지정한 entity 반환 형식의 쓰기

Query query = entityManager.createNativeQuery("select id, name, age from t_user", User.Class); 
여기서 주의해야 할 것은 맵을 사용하는 것이 Object 수조로 하는 것보다 효율이 낮을 것이다.그러니 성능이 떨어지는지 받아들일 수 있는 범위 내에 있는지 확인해야 한다.그리고 내 Hibernate 4.2에서.x의 환경에서 원생 SQL에 대문자로 쓰였든 소문자로 쓰였든 되돌아오는 필드 이름은 대문자로 되어 있습니다.물론 사용자 정의 Result Transformer 형식으로 필드 이름을 일정하게 처리할 수 있으며, 심지어는 자신이 필요로 하는 POJO를 되돌려줄 수도 있다.
이상에서 JPA의 Query 조회 인터페이스를 맵 대상으로 되돌려주는 방법은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 참고 부탁드리고 저희도 많이 사랑해 주세요.

좋은 웹페이지 즐겨찾기