Spring JPA查询抛出String转UserDetail无转换器异常如何解决
问题根因
你的Repository层原生SQL仅查询了phoneNumber、textMessage两个字段,JPA原生查询默认会将多字段返回结果封装为Object[]类型,而你声明的方法返回值为UserDetail实体类,Spring没有内置转换器可以把两个字段的查询结果直接映射为完整UserDetail对象,因此抛出转换器找不到的异常。
另外你的SQL语法存在错误:FROM UserDetail entity usd中多写了无效的entity字段,需要删除避免后续SQL执行报错。
解决方案
根据你的业务需求可以选择以下任意一种方案:
- 方案1:查询全量字段直接映射实体
若业务需要完整的UserDetail实体数据,将SQL修改为查询表内所有字段即可:@Query(value = "SELECT usd.* FROM UserDetail usd WHERE usd.created_date=:createdDate", nativeQuery = true) UserDetail findByCreatedDate(LocalDateTime createdDate); - 方案2:定义投影接口接收指定字段
若业务仅需要phoneNumber、textMessage两个字段,先定义对应投影接口:
再修改Repository方法返回值为投影接口:public interface UserDetailProjection { String getPhoneNumber(); String getTextMessage(); }
Service层对应修改返回类型即可,调用投影接口的get方法就能获取对应字段值。@Query(value = "SELECT usd.phoneNumber,usd.textMessage FROM UserDetail usd WHERE usd.created_date=:createdDate", nativeQuery = true) UserDetailProjection findByCreatedDate(LocalDateTime createdDate); - 方案3:自定义结果转换器(仅复杂场景推荐)
你也可以手动实现Spring的Converter接口,将查询返回的Object[]手动映射为UserDetail对象,不过简单场景下没必要使用该方案。
内容的提问来源于stack exchange,提问作者iwritecomeinmymind
相关产品推荐
相关产品推荐

