带有 resultClass 参数的 NamedQuery 未返回查询结果的预期“类型”

Posted

技术标签:

【中文标题】带有 resultClass 参数的 NamedQuery 未返回查询结果的预期“类型”【英文标题】:NamedQuery with resultClass parameter not returning expected "type" for the query result 【发布时间】:2013-11-20 08:56:54 【问题描述】:

我有以下命名查询;

@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。相反,我将类型作为 Vector 包含 Object 数组。

如何使查询显式返回“Person”类型?

【问题讨论】:

这不是已经在***.com/questions/20090094/…中介绍过吗? 关于获取记录的整体方法,这是一个不同的问题 'getNamedQuery(String, Class)' 是什么方法?它既不是hibernate也不是JPA。 它实际上是 TypedQuery createNamedQuery( String name, Class resultClass ) 那么您不必在结果列表中期望Person 的实例。顺便说一句,你在这里期待什么?仅初始化了 nameage 字段的 Person 实例列表? 【参考方案1】:

JPA 规范说(3.8.6 查询执行):

对于 TypedQuery 实例,查询结果类型在 case of criteria 查询时指定的查询类型 创建 CriteriaQuery 对象,如 6.5.1 节所述, “CriteriaQuery 创建”。在 Java Persistence 查询的情况下 语言查询,结果的类型由 createQuery 或 createNamedQuery 方法的 resultClass 参数, 查询的选择列表必须只包含一个项目 必须可以分配给指定的类型

所以,查询应该看起来像我在评论中已经提到的那样:

Select p from Person p WHERE ...

如果您不想检索整个数据集,那么您可以像现在一样处理VectorList,或者创建另一个普通类并使用http://docs.oracle.com/javaee/5/api/javax/persistence/SqlResultSetMapping.html 以便仅分配必要的字段.

【讨论】:

【参考方案2】:

问题是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 接口。

【讨论】:

嘿,我在任何地方都找不到 q.list() 你在使用 Hibernate 吗?它位于org.hibernate 包中。 我正在使用 javax.persistence / org.eclipse Thx...所以我必须进行 2 次更新...使用 TypedQuery query = getNamedQuery(...) 并更改为 List resultList = query.getResultList(); 请确认一致【参考方案3】:

相关方法的完整签名是

public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass);

resultClass 是返回类型化查询所必需的(因此要指定类型参数 T)。它对查询本身没有任何作用。如果你只使用TypedQueryQuery 超接口,那么这个参数就没用了。否则,您可以执行类似的操作(无需强制转换):

List<Person> list = mgr.createNamedQuery("Person.All", Person.class).getResultList();

同样,类参数不会启动结果的任何转换/转换等。就像在 Java 中一样,它只是必需的,类型参数会被编译器删除并且在运行时不可用。

【讨论】:

以上是关于带有 resultClass 参数的 NamedQuery 未返回查询结果的预期“类型”的主要内容,如果未能解决你的问题,请参考以下文章

阿里规范 - MySQL 数据库 - ORM映射 - 3 - 强制不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应

mybatis查询返回返回的字段比resultclass的属性少会不会报错

org.hibernate.HibernateException:缺少列

可以createNativeQuery的EnityManager返回resultClass即dojo类

ibatis/mybatis属性三:resultMap和resultClass/resultType

ibatis中in语句参数传入方法