我有以下命名查询;
@NamedQuery(name = "Person.findSpecific", query = "Select p.name, p.age from Person WHERE ..."
Query query = getNamedQuery("Person.findSpecific",Person.class);
当我执行代码时;
List resultList = query.getResultList();
我没有获得类型为Person的resultList,即使我已明确指定参数到命名查询。相反,我得到的类型为包含Object数组的Vector。
如何使查询显式返回“Person”类型?
答案 0 :(得分:1)
JPA规范说(3.8.6查询执行):
对于TypedQuery实例,查询结果类型在。中确定 标准查询的情况由查询时指定的类型查询 创建CriteriaQuery对象,如6.5.1节所述, “CriteriaQuery Creation”。在Java Persistence查询的情况下 语言查询,结果的类型由 createQuery或createNamedQuery方法的resultClass参数, 和查询的选择列表必须只包含一个项目 必须可分配给指定的类型。
所以,查询看起来应该像我在评论中提到的那样:
Select p from Person p WHERE ...
如果您不想检索整个数据集,那么您可以像现在一样处理List
Vector
,或创建另一个普通类并使用http://docs.oracle.com/javaee/5/api/javax/persistence/SqlResultSetMapping.html为了只分配必要的字段。
答案 1 :(得分:0)
问题是getResultList()
会返回无类型的List
:
执行SELECT查询并将查询结果作为无类型返回 列表。
如果您希望查询显式返回Person
,则可以使用JPA实现的Query
对象。例如在Hibernate中它看起来像这样:
session.createQuery(queryString);
q.list();
如果你想使用JPA,你可以这样做:
EntityManager em = getEntityManager(); // get it from somewhere
TypedQuery<Person> p = em.createQuery(queryString, Person.class);
关键是TypedQuery
是通用的。您没有在代码中传递类型参数,而只是使用Query
接口。
答案 2 :(得分:0)
有问题的方法的完整签名是
public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass);
返回类型化查询需要 resultClass
(因此要指定类型参数T)。它在查询本身中没有任何魔力。它只使用Query
的{{1}}超级接口,那么参数就没用了。否则你可以做那样的事情(没有施法):
TypedQuery
同样,类参数不会启动结果的任何转换/转换等。它只是在Java中需要,类型参数会被编译器擦除,并且在运行时不可用。