복붙노트

[SQL] JPA 기본 쿼리는 반환 개체하지만 역 참조 클래스 캐스트 예외가 발생 가입

SQL

JPA 기본 쿼리는 반환 개체하지만 역 참조 클래스 캐스트 예외가 발생 가입

나는 테이블에 가입 JPQL 기본 쿼리를 사용하고 쿼리 결과가 목록에 저장되는 .

public String getJoinJpqlNativeQuery() {



            String final SQL_JOIN = 
               "SELECT v1.bitbit, v1.numnum, v1.someTime, t1.username, 
                t1.anotherNum FROM MasatosanTest t1 
                JOIN MasatoView v1 ON v1.username = t1.username;"

            System.out.println("get join jpql native query is being called 
        ============================");

            EntityManager em = null;
            List<Object[]> out = null;
            try {
                em = EmProvider.getDefaultManager();
                Query query = em.createNativeQuery(SQL_JOIN);
                out = query.getResultList();

                System.out.println("return object ==========>" + out);

                System.out.println(out.get(0));

                String one = out.get(0).toString(); //LINE 77 where ClassCastException
                System.out.println(one);
            }
            catch(Exception e) {
            }
            finally {
                if(em != null) { em.close; }
            }
}

문제는

에서 System.out.println ( "반환 객체 ==========>"+ 아웃); 출력 :

return object ==========>
[[true, 0, 2010-12-21 15:32:53.0, masatosan, 0.020], 
[false, 0, 2010-12-21 15:32:53.0, koga, 0.213]]

에서 System.out.println (아처 (0))를 출력한다 :

[true, 0, 2010-12-21 15:32:53.0, masatosan, 0.020]

그래서 내가 문자열해야 봐 이걸 (0)의 반환 값을 할당 할 수 있다고 가정 :

String one = out.get(0).toString();

그러나 나는 이상한 ClassCastException이 얻을.

java.lang.ClassCastException: java.util.Vector cannot be cast to 
[Ljava.lang.Object;
        at local.test.jaxrs.MasatosanTestResource.getJoinJpqlNativeQuery
(MasatosanTestResource.java:77)

그래서 정말 무슨 일이야? 심지어 개체 [] = foo를 이라구 (0); ClassCastException를 슬로우 것입니다 :(

해결법

  1. ==============================

    1.나는 JPQL 기본 쿼리에 익숙하지 해요,하지만 당신은 단순히 함께 디버깅 :

    나는 JPQL 기본 쿼리에 익숙하지 해요,하지만 당신은 단순히 함께 디버깅 :

    이라구 = O 개체 (0); 에서 System.out.println (o.getClass ());

    그리고 거기에서 작동합니다. 그것은 반복 처리를 통해 벡터, 그리고 벡터에서 무엇을 찾을 경우.

  2. ==============================

    2.하나 이상의 열 또는 엔티티보다 SELECT 절 쿼리 결과가 (오브젝트 [])를 java.util.List에 의해 반환이 getResultList에 () 객체 배열 집계된다.

    하나 이상의 열 또는 엔티티보다 SELECT 절 쿼리 결과가 (오브젝트 [])를 java.util.List에 의해 반환이 getResultList에 () 객체 배열 집계된다.

     //---
    
        Query query = manager.createQuery("SELECT v1.bitbit, v1.numnum, v1.someTime, t1.username, t1.anotherNum FROM MasatosanTest t1 JOIN MasatoView v1 ON v1.username = t1.username;");
    
        List results = query.getResultList( ); // Fetches list containing arrays of object
        Iterator it = results.iterator( );
    
        while (it.hasNext( )) {
    
           Object[] result = (Object[])it.next(); // Iterating through array object 
    
           Boolean first = (Boolean) result[0]; // Fetching the field from array
    
           /* Likewise for all the fields, casting accordingly to the sequence in SELECT query*/
    
        }
    
        //---
    

    편집하다 : 명시 적으로 캐스팅 방지하려면 적절한 인수를 사용하여 개체에 생성자를 추가, 생성자 표현 갈 수 있습니다.

    SELECT new org.somepackage.XEntity(x.a, x.b) FROM XEntity x
    
  3. from https://stackoverflow.com/questions/4536655/jpa-native-query-join-returns-object-but-dereference-throws-class-cast-exception by cc-by-sa and MIT license