Я легко могу сделать это с 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