JPA 2.0에서는 EntityManager.createnativeQuery ()를 사용하여 기본 SQL 문을 실행할 수 있습니다. 그러나 쿼리 결과에 해당 엔티티 클래스가 없으면 Query.getResultList ()가 목록 <객체 []>을 반환합니다. 즉, 각 행의 데이터는 객체 배열로 반환됩니다.
일반적인 사용법은 다음과 같습니다.
public void testNativeQuery () {query query = entityManager.CreatEnativeQuery ( "선택, 이름, t_user의 나이"); list rows = query.getResultList (); for (Object Row : 행) {Object [] 셀 = (Object []) 행; System.out.println ( "id =" + 셀 [0]); System.out.println ( "name =" + 셀 [1]); System.out.println ( "age =" + 셀 [2]); }}이런 식으로 코드를 이해하기가 매우 어렵게 만듭니다. 첨자가 0 인 요소는 정확히 무엇입니까? 쿼리 명령문을 계산하지 않더라도 알려져 있지 않습니다. 또한 쿼리 문이 조정되면 Java 코드도 함께 조정해야합니다. 현재 맵이 반환되면 사용하기가 훨씬 더 명확하다고 생각합니다.
불행히도 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 ( "선택, 이름, t_user의 나이"); query.unwrap (sqlquery.class) .setresulttransformer (transfer.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 query = entitymanager.createnativeQuery ( "선택 ID, 이름, T_USER의 나이", User.Class);
여기서 맵을 사용하는 것은 객체 배열을 사용하는 것보다 확실히 덜 효율적이라는 점에 유의해야합니다. 따라서 성능 강하가 허용 가능한 범위 내에 있는지 확인해야합니다. 그런 다음 내 최대 절전 모드 4.2.x 환경에서, 기본 SQL에 대문자 또는 소문자를 쓰더라도 반환 된 필드 이름이 대문자로 표시됩니다. 물론, resultTransformer를 사용자 정의하여 필드 이름을 특정 방식으로 처리하고 필요한 pojo를 반환 할 수도 있습니다.
JPA의 쿼리 쿼리 인터페이스 리턴 맵 객체가 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.