具有单列的 EntityManager createQuery 引发类型错误
Posted
技术标签:
【中文标题】具有单列的 EntityManager createQuery 引发类型错误【英文标题】:EntityManager createQuery with single column throws type error 【发布时间】:2021-12-14 08:35:42 【问题描述】:我正在使用LocalContainerEntityManagerFactoryBean
和OracleUCPConfig
我有类 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<String> ids = em.createQuery("select e.id from Employee e", String.class).getResultList();
【参考方案2】:
createQuery()的第二个参数是查询结果的类型。在您的情况下,结果类型是 String
(String
s 的列表),因为您只有 SELECT
列 id
。
所以这应该有效:
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以上是关于具有单列的 EntityManager createQuery 引发类型错误的主要内容,如果未能解决你的问题,请参考以下文章
TransactionRequiredException:没有用于当前线程的具有实际事务的EntityManager-无法可靠地处理“合并”调用
我的单元测试问题 - Junit - mockito - EntityManager - createNativeQuery