Spring JPA非原生查询返回指定列无法返回Item对象的问题
解决Spring JPA非原生查询返回Item对象的问题
问题原因
你的JPQL语句只查询了i.id字段,JPA会直接返回该字段的String值,不会自动封装成Item对象,和你声明的返回类型不匹配。
可行方案
方案1:查询完整的Item实体(最直接)
如果可以接受查询该条记录的所有列,直接修改JPQL语句查询整个Item实例:
public interface ItemRepository extends PagingAndSortingRepository<Item,String> { @Query("SELECT i FROM Item i where i.id = ?1") Optional<Item> getit(String id); }
这样JPA会返回完整的Item对象,符合你声明的返回类型。
方案2:用动态投影实现指定列查询(返回投影对象)
如果必须只查询指定列,又不想修改Item类,可以定义一个投影接口来接收结果:
- 创建投影接口:
public interface ItemIdProjection { String getId(); }
- 修改Repository方法的返回类型:
public interface ItemRepository extends PagingAndSortingRepository<Item,String> { @Query("SELECT i.id FROM Item i where i.id = ?1") Optional<ItemIdProjection> getit(String id); }
注意:这种方式返回的是投影接口的实例,不是Item实体本身。如果必须返回Item实体,只能用方案1,或者先查询id再调用findById(id)获取完整实体(会多一次数据库查询)。
关于原生查询的说明
你提到原生查询能正常工作,大概率是因为原生查询中你选择了所有列(SELECT *),而非仅id列,所以JPA能将结果映射为Item实体。
内容的提问来源于stack exchange,提问作者Tirmean
相关产品推荐
相关产品推荐

