带有 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。 它实际上是 TypedQueryPerson
的实例。顺便说一句,你在这里期待什么?仅初始化了 name
和 age
字段的 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 ...
如果您不想检索整个数据集,那么您可以像现在一样处理Vector
的List
,或者创建另一个普通类并使用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相关方法的完整签名是
public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass);
resultClass
是返回类型化查询所必需的(因此要指定类型参数 T)。它对查询本身没有任何作用。如果你只使用TypedQuery
的Query
超接口,那么这个参数就没用了。否则,您可以执行类似的操作(无需强制转换):
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类