【问题标题】:JPA: Result list - Cast Object[] to tupleJPA:结果列表 - 将 Object[] 转换为元组
【发布时间】:2013-04-24 04:39:18
【问题描述】:

简单的问题,但我没有看到我的推理错误。以选定成员而不是整个行/实体作为结果的命名查询。

现在我想用方便的元组方法访问成员字段。

q = em.createNamedQuery("test.findvar");
List<Tuple> tuples = q.getResultList();    
for (Tuple t : tuples)
   System.out.println(t.get(0) + " " + t.get(1));

不幸的是它把我扔了:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javax.persistence.Tuple

一切正常:

q = em.createNamedQuery("test.findvar");
List<Object[]> objs = q.getResultList();    
for (Object[] obj : objs)
    System.out.println(obj[0] + " " + obj[1]);

我的第一个解决方案有什么问题?

【问题讨论】:

  • 你确定q.getResultList(); 正在返回List&lt;Tuple&gt; 我从第二种解决方案中看到的是它返回的是对象数组列表而不是元组

标签: java jpa entity


【解决方案1】:

对于 Java 8 OpenJDK 1.8.0、EJB 3.2、Payara (Glassfish) 5.183,将 Tuple.class 作为 createNamedQuery 的第二个参数无效。它编译得很好,但 getResultList() 调用仍然返回 List.

此外,新的 getResultStream() 方法返回一个 Stream,带有或不带有 Tuple.class 参数。

更糟糕的是,编译器似乎不知道列表中流式传输或使用的对象的类型(一个错误 IMO),因此任何实际使用返回的查询值的尝试都会产生编译器错误,除非该值被显式转换.

【讨论】:

    【解决方案2】:

    您可以在 createNamedQuery() 中指定返回类型,如 javadoc 中所述

    所以你的代码应该是这样的:

    q = em.createNamedQuery("test.findvar", Tuple.class);
    List<Tuple> tuples = q.getResultList();    
    for (Tuple t : tuples)
       System.out.println(t.get(0) + " " + t.get(1));
    

    当您指定返回类型时,将创建 TypedQuery 实例,而不是 Query 实例。查询不使用泛型,只返回 java.util.List。

    【讨论】:

    • 让我纠正一下,它不像预期的那样: List tuples = em.createNamedQuery("getInfo", Tuple.class).setParameter("param",1).getResultList() ;其次是 tuples.get(0).getClass() 给我一个“ClassCastException” - “对象不能转换为 javax.persistence.Tuple”
    猜你喜欢
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2015-02-13
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多