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

Joh*_*pel 1 java entity jpa

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

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

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

不幸的是它让我困惑:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javax.persistence.Tuple
Run Code Online (Sandbox Code Playgroud)

一切正常:

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

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

Dmi*_*kov 5

您可以在 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));
Run Code Online (Sandbox Code Playgroud)

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