当前位置: 首页 > 知识库问答 >
问题:

NamedQuery参数不返回查询结果的预期"type"

端木野
2023-03-14

我有以下命名查询;

@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,即使我已经明确指定了命名查询的参数。相反,我得到的类型是包含对象数组的向量。

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

共有3个答案

苏阳州
2023-03-14

该方法的完整签名是

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

resultClass是返回类型化查询所必需的(以便指定类型参数T)。它对查询本身没有任何魔力。如果你只使用TypedQueryQuery超级界面,那么这个参数就没用了。否则,你可以做类似的事情(无需铸造):

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

同样,class参数不会启动结果的任何转换。就像在Java中一样,类型参数会被编译器删除,在运行时不可用。

申屠俊发
2023-03-14

问题是getResultList()返回一个非类型化的列表

执行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);

关键是TypeQuery是通用的。您没有在代码中传递类型参数,只是使用Query接口。

苏晓博
2023-03-14

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

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

因此,查询应该看起来像我已经在评论中提到的:

从人物p WHERE中选择p...

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

 类似资料:
  • 问题内容: 我正在使用Newtonsoft的Json.Net从以下json中选择节点: 以下C#代码段 产量: 现在,这很酷,我想做的是按客户端代码过滤,我认为 可以,但是我显然对语法不够了解。这将返回一个空列表: 并且单个令牌选择器返回null: 我在https://jsonpath.curiousconcept.com/上尝试了几种不同的配置,看来我的查询语法确实坏了。 使用Flow Comm

  • 我正在玩mongob,并将一些测试数据{name:"david"}输入到“用户”集合中。我通过键入mongoshell验证了数据在MongoDB中 结果: 在 node.js 脚本中,使用以下代码: 不返回任何结果 我没有发现任何错误,也没有错误。请告知

  • 我有一个带有两个衰减函数(ES 2.4.4)的查询,我使用对查询项中的衰减函数得分求和。对于测试,我使用来防止任何其他分数(来自查询)影响我的分数(我想测试衰减函数)。 这些是我的衰减函数: 我的结果包括2篇不同日期的文章(2017-08-28,2009-05-08)具有相同的优先级(1000)和相同的分数!(13.122)怎么会这样?为什么没有获得更好的分数?所以我试图解释查询。 对于2017-

  • 我有下面的SQL查询,我在flink工作中使用。< code>mysql_table是使用JDBC连接器创建的,而< code>kafa_source表是从传入的kafka流创建的。 我在两者之间执行时态连接,当我在Flink的sql-client CLI中检查时,运行良好(用< code>flink-faker测试)。内部查询工作得非常好,并且正在打印结果。有人能帮助我找出这个问题吗? 编辑:我

  • 问题内容: 是否可以以预定顺序进行声明,即 选择ID 7,2,5,9和8 并以该顺序返回它们 ,仅基于ID字段? 这两个语句以相同顺序返回它们: 问题答案: 我不认为这是可能的,但是在这里找到了一个博客条目,似乎可以满足您的需求: 将给不同的结果 返回给定第二个参数的位置,因此对于上面的第一种情况,7的位置在集合中的位置1,2的位置在2,依此类推-mysql在内部得出类似 然后按的结果排序。

  • 我想mock接受对象参数的方法。此对象参数是从动态创建的。不会返回预期的结果,尽管这两个对象具有相同的数据,但只是不同的哈希代码。 有没有什么方法来模拟方法,使它能够以预期的结果响应?