带有resultClass参数的NamedQuery不为查询结果返回预期的“type”

时间:2013-11-20 08:56:54

标签: java sql jpa named-query

我有以下命名查询;

@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”类型?

3 个答案:

答案 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中需要,类型参数会被编译器擦除,并且在运行时不可用。