具有单列的 EntityManager createQuery 引发类型错误

Posted

技术标签:

【中文标题】具有单列的 EntityManager createQuery 引发类型错误【英文标题】:EntityManager createQuery with single column throws type error 【发布时间】:2021-12-14 08:35:42 【问题描述】:

我正在使用LocalContainerEntityManagerFactoryBeanOracleUCPConfig

我有类 EmployeeEntity.java 映射到表员工

我写了一个createQuery代码为

Query query = em.createQuery("select id from Employee", EmployeeEntity.class);
query.getResultList()

我收到以下错误:

Type specified for TypedQuery [EmployeeEntity] is incompatible with [java.lang.String]

我该如何解决这个问题?

我希望表中的所有 id 不需要检索任何其他字段

--编辑--

我通过将 JQL 更改为 JPQL 解决了这个问题

Query query = em.createQuery("select new EmployeeEntity(id) from Employee", EmployeeEntity.class);
query.getResultList()

【问题讨论】:

出于好奇,什么样的场景需要由单个字段组成的 EmployeeEntity,该字段是另一个实体的字符串 id? 【参考方案1】:

您将id 映射到类型EmployeeEntity,如果您检查您的查询,您将只提取id 而不是所有内容:select id from Employee。您可以通过将查询更改为:

Query query = em.createQuery("select e from Employee e", EmployeeEntity.class);

如果您只需要 id 列,您可以执行以下操作:

TypedQuery<String> query = em.createQuery("select e.id from Employee e", String.class);
List<String> ids = query.getResultList();

【讨论】:

true,但我希望表中的所有 id 不需要检索任何其他字段 @DickensAS 如果你想把它合二为一,你可以这样做List&lt;String&gt; ids = em.createQuery("select e.id from Employee e", String.class).getResultList();【参考方案2】:

createQuery()的第二个参数是查询结果的类型。在您的情况下,结果类型是 StringStrings 的列表),因为您只有 SELECTid

所以这应该有效:

Query query = em.createQuery("select e.id from Employee e", String.class);
List<String> ids = query.getResultList();

【讨论】:

你的意思是说,我需要再写一个for循环来形成EmployeeEntity作为服务结果,spring不提供这样的功能吗? 不,我用正确的查询更新了我的答案,只选择了 id 字段 根据您的问题,您“希望表中的所有 id 不需要检索任何其他字段”。如果您想要一个包含实体的列表,请使用Query query = em.createQuery("select e from Employee e", EmployeeEntity.class) 我将查询更改为 JPQL,这解决了我的问题,而无需编写另一个代码将 List 转换为 List 从技术上讲我不想要另一个循环

以上是关于具有单列的 EntityManager createQuery 引发类型错误的主要内容,如果未能解决你的问题,请参考以下文章

TransactionRequiredException:没有用于当前线程的具有实际事务的EntityManager-无法可靠地处理“合并”调用

我的单元测试问题 - Junit - mockito - EntityManager - createNativeQuery

在 where 和 orderby 子句中使用两个单列索引

在其他列中计算具有多个条件的 NaN 单列

具有多列查询单列的 Oracle 索引

透视数据并将单列放入具有关联行的多列中