Собственное соединение запроса JPA возвращает объект, но разыменование вызывает исключение приведения класса - PullRequest
3 голосов
/ 27 декабря 2010

Я использую собственный запрос JPQL для объединения таблиц, и результат запроса сохраняется в List<Object[]>.

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 ==========>" + out); выходы:

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(out.get(0)) выходы:

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

Поэтому я предположил, что могу присвоить возвращаемое значение out.get (0), которое должно быть String:

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)

Так что на самом деле происходит? Даже Object[] foo = out.get(0); выдаст исключение ClassCastException: (

Ответы [ 2 ]

10 голосов
/ 27 декабря 2010

Предложение SELECT запрашивает более одного столбца или объекта, результаты агрегируются в массив объектов (Object []) в 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
2 голосов
/ 27 декабря 2010

Я не знаком с собственным запросом JPQL, но вы просто отлаживаете:

Объект o = out.get (0); System.out.println (o.getClass ());

Тогда работай оттуда. Если это вектор, переберите его и найдите, что находится в векторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...