如何处理JPQL查询返回的Object类型?

我可以使用仅从一个表返回数据的JPQL轻松完成此操作。

SELECT m1 FROM MasatosanTest m1 

这意味着返回一种数据类型。 所以我可以将查询结果存储到指定类型的List中:

 List mt = query.getResultList(); 

代码段

 private static final String JPQL_TEST = "SELECT m1 FROM MasatosanTest m1; @Path("innerJoin") @GET @Produces("application/json") public List getJoinedResult() { System.out.println("getJoinedResult called"); EntityManager em = null; List 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; } 

现在,如果我尝试涉及2个表的JPQL ….

询问

 SELECT m1, m2 FROM Masatosan m1, Masatosan2 m2; List result = query.getResultList(); 

这不会导致立即错误,但实际上返回的是Object类型而不是MasatosanMasatosan2等特定类型

所以当我迭代时,它会导致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 ,该对象包含2种类型的对象(即M asatosan ObjectMasatotan2 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 

这可能会返回ListClassCastException的消息将具有确切的类型。 如果我是对的:

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

引用文档

当在SELECT子句中使用多个select_expressions时,查询的结果是Object []类型,并且此结果中的元素按照SELECT子句中的规范顺序对应