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

Posted

技术标签:

【中文标题】如何处理 JPQL 查询返回的 Object 类型?【英文标题】:How to deal with Object type returned by JPQL query? 【发布时间】:2010-12-22 09:15:30 【问题描述】:

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

SELECT m1 FROM MasatosanTest m1

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

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

代码 sn-p

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;
        

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

查询

SELECT m1, m2 FROM Masatosan m1, Masatosan2 m2;

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

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

所以当我迭代时,它会导致 CASTException,

for(Masatosan item : result)  .... 

处理这种情况的好方法是什么?

更新

如果我系统打印变量“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&lt;Object&gt;中,其中包含2种类型的对象(即Masatosan ObjectMasatotan2对象)

还有 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】:

这可能会返回List&lt;Object[]&gt;ClassCastException 的消息将具有确切的类型。如果我是对的:

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

引用the docs

当SELECT子句中使用多个select_expression时,查询的结果为Object[]类型,该结果中的元素按照它们在SELECT子句中指定的顺序依次对应

【讨论】:

啊,明白了,难怪它不会投射,没有考虑到数组内部,感谢文档链接和帮助! 如果我没记错的话,其实我没有看到数组。。会更新。 好的...我已经确认您是正确的。我正在运行错误的测试:p 我在做 List 而不是使用 List 所以我的测试返回了无效的输出。 +1 即将问同样的问题。简洁明了的答案,谢谢 另见***.com/q/2355728/286532 使用 SELECT NEW 将结果提供给类构造函数

以上是关于如何处理 JPQL 查询返回的 Object 类型?的主要内容,如果未能解决你的问题,请参考以下文章

当数据库为表中的一列返回空值时如何处理错误

如何处理在 php mysql 中返回多个值的内部查询?

kotlin 不确定如何处理插入方法的返回类型

如何处理返回布尔值的 GraphQL 查询?

如何处理 Nswag 方法的 FileResponse 返回类型

房间错误:不确定如何处理插入方法的返回类型