JPA:结果列表 - 将对象[]转换为元组

时间:2013-04-30 09:46:00

标签: java jpa entity

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

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

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]);

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

2 个答案:

答案 0 :(得分:3)

您可以在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实例。 Query不使用泛型,只返回java.util.List。

答案 1 :(得分:0)

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

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

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