简单的问题,但我没有看到我的推理错误。使用选定成员作为结果而不是整个行/实体的命名查询。
现在我想使用方便的元组方法访问成员字段。
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]);
我的第一个解决方案出了什么问题?
答案 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
更糟糕的是,编译器似乎不知道从列表中流式传输或使用的对象的类型(一个错误 IMO),因此任何实际使用返回的查询值的尝试都会导致编译器错误,除非该值被显式转换.