1

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

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

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

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

4

2 回答 2

4

您可以在 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。

于 2013-04-30T09:55:43.090 回答
0

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

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

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

于 2021-06-07T21:32:43.777 回答