Spring Boot项目JPA投影查询结果与接口视图字段不匹配问题
问题根因
你使用原生SQL查询做JPA投影时,返回的数据库字段名(下划线命名,如rental_contract_id)和投影接口的属性名(驼峰命名,如rentalContractId)没有匹配上,Spring Data JPA无法完成自动映射,因此所有字段返回null。
解决方案
方案1:修改原生SQL,添加字段别名(最简单)
将Repository层的原生查询修改为以下写法,给每个字段指定和投影接口属性完全一致的别名:
@Query(value = "SELECT " + "rental_contract_id as rentalContractId, " + "object_id as objectId, " + "property_id as propertyId " + "from rental_contract", nativeQuery = true) List<RentalContractView> getAllWithObjectsAndProperties();
修改后接口投影会自动匹配别名完成映射,即可正常获取所有字段值。
方案2:改用JPQL查询(无需适配数据库下划线命名)
如果不需要使用原生SQL特性,推荐改用JPQL查询,直接基于实体属性取值,避免下划线和驼峰的转换问题:
@Query("SELECT " + "r.rentalContractId as rentalContractId, " + "r.propertyObject.objectId as objectId, " + "r.propertyObject.property.propertyId as propertyId " + "FROM RentalContract r") List<RentalContractView> getAllWithObjectsAndProperties();
方案3:使用自定义DTO类接收(适合复杂映射场景)
如果使用自定义类作为投影接收对象,除了要保证查询的字段别名和DTO属性名一致,还要保证DTO提供无参构造方法、对应属性的getter/setter方法:
// 自定义DTO示例 @Getter @Setter @NoArgsConstructor public class RentalContractDTO { private Long rentalContractId; private Long objectId; private Long propertyId; }
Repository方法返回值改为List<RentalContractDTO>即可。
注意事项
Spring Data JPA 2.x及以上版本对原生查询的投影别名匹配大小写敏感,别名必须和投影属性名完全一致,不能出现大小写偏差。
内容的提问来源于stack exchange,提问作者f.trajkovski
相关产品推荐
相关产品推荐

