EntityManager createQuery查询单列报类型不兼容错误的解决方法
问题原因
报错的核心原因是:JPQL语句select id from Employee仅查询单个id字段,返回结果的类型为id对应的Java类型(报错信息显示为java.lang.String),但你调用createQuery时指定的返回类型为EmployeeEntity.class,二者类型不匹配导致类型校验失败。
解决方案
方案1:直接获取ID列表(更贴合仅需ID的需求,无需实例化实体类)
如果你只需要id字段的集合,不需要封装为EmployeeEntity对象,直接将查询返回类型指定为id对应的类型即可,示例代码如下:
// 若id为Long类型,就将第二个参数替换为Long.class TypedQuery<String> query = em.createQuery("select id from Employee", String.class); List<String> idList = query.getResultList();
方案2:使用构造器表达式封装为实体对象(你补充的解决方案)
你使用的select new EmployeeEntity(id)属于JPQL的构造器查询语法,该方案生效的前提是:你的EmployeeEntity类中已经定义了仅接收id类型参数的构造方法,同时要注意保留JPA强制要求的无参构造方法,避免其他常规实体查询报错。
对应实体类需要补充的代码示例:
@Entity public class EmployeeEntity { private String id; // 其他字段省略 // JPA要求的无参构造,必须保留 public EmployeeEntity() {} // 构造器查询需要的带参构造 public EmployeeEntity(String id) { this.id = id; } // 省略get、set方法 }
内容的提问来源于stack exchange,提问作者Dickens A S
相关产品推荐
相关产品推荐

