Как бороться с типом объекта, возвращаемым запросом JPQL? - PullRequest
5 голосов
/ 22 декабря 2010

Я легко могу сделать это с JPQL, который возвращает данные только из одной таблицы.

SELECT m1 FROM MasatosanTest m1

Это означает, что возвращается один тип данных. Поэтому я могу просто сохранить результат запроса в списке с указанным типом:

List<MasatosanTest> mt = query.getResultList();

фрагмент кода

private static final String JPQL_TEST = "SELECT m1 FROM MasatosanTest m1;

    @Path("innerJoin")
        @GET
        @Produces("application/json")
        public List<MasatosanTest> getJoinedResult() {
            System.out.println("getJoinedResult called");
            EntityManager em = null;
            List<MasatosanTest> mt = null;

            try {
                em = EmProvider.getDefaultManager();
                Query query = em.createQuery(JPQL_TEST);
                mt = query.getResultList();
            }
            catch(Exception e) {
                System.out.println("MasatosanTestResource.java - getJoinedResult ERROR: " + e);
            }
            finally {
                if(em != null) {
                    em.close();
                }
            }
            return mt;
        }

Теперь, если я попробую JPQL, включающий 2 таблицы ...

запрос

SELECT m1, m2 FROM Masatosan m1, Masatosan2 m2;

List<Masatosan> result = query.getResultList(); 

Это не вызывает немедленной ошибки, однако фактически возвращается тип объекта вместо определенного типа, такого как Masatosan или Masatosan2

Поэтому, когда я выполняю итерацию, это вызывает CASTException,

for(Masatosan item : result) { .... }

Каков хороший способ справиться с этим сценарием?

UPDATE

Если я распечатаю переменную "result", она выплевывает:

return object ==========>
[[Ljava.lang.Object;@1540f1e, [Ljava.lang.Object;@1ac7e54, [Ljava.lang.Object;@199cd0a, 
[Ljava.lang.Object;@6487d7, [Ljava.lang.Object;@125755, [Ljava.lang.Object;@239ff3, 
[Ljava.lang.Object;@da2335, [Ljava.lang.Object;@13da77b, [Ljava.lang.Object;@bea4e1, 
[Ljava.lang.Object;@3add4b, [Ljava.lang.Object;@968e06, [Ljava.lang.Object;@4642c8, 
[Ljava.lang.Object;@ca81a4, [Ljava.lang.Object;@105510f, [Ljava.lang.Object;@cde78, 
[Ljava.lang.Object;@e1b60e, [Ljava.lang.Object;@776306, [Ljava.lang.Object;@6275c, 
[Ljava.lang.Object;@21035, [Ljava.lang.Object;@1762346, [Ljava.lang.Object;@105ea3d, 
[Ljava.lang.Object;@15564f6, [Ljava.lang.Object;@1577817, [Ljava.lang.Object;@18d30be, 
[Ljava.lang.Object;@7b235c, [Ljava.lang.Object;@4e83d4, [Ljava.lang.Object;@b0f862]

Во-первых, я думал, что я в массиве, но , что [скобка внутри первого, кажется, просто часть String ???

Для проверки:

 for(Object items : result) {
            System.out.println("-------------------" + items);
            System.out.println(items.toString());
            return null;
        }

Будет выведено:

 -------------------[Ljava.lang.Object;@c723e8
[Ljava.lang.Object;@c723e8

Таким образом, квадратная скобка рядом с «L» не представляет массив.

Это означает, что результат запроса фактически сохраняется в List<Object>, который состоит из объектов 2 типов (то есть M asatosan Object и Masatotan2 Object)

И ClassCastException :( Я в замешательстве, оно должно быть кастуемым)

 int count = 0;
        for(Object items : mt) {
            System.out.println("-------------- " + count + " --------------" + items);
            count ++;
            Masatosan woot = (Masatosan) items;
            System.out.println(woot.getUsername());
        }

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to local.test.entity.Masatosan

1 Ответ

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

Это, возможно, возвращает List<Object[]>. Сообщение ClassCastException будет иметь точный тип. Если я прав:

for (Object[] items : result) {
    Masatosan m1 = (Masatosan) items[0];
    Masatosan m2 = (Masatosan) items[1];
}

Цитировать Документы

Когда в предложении SELECT используется несколько выражений select_expression, результат запроса имеет тип Object [], и элементы в этом результате соответствуют порядку их спецификации в предложении SELECT

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