为什么JPA接口投影查询Customer的firstName和lastName返回空值?
问题根因
- 自定义JPQL查询返回的字段没有设置和投影接口匹配的别名,JPA动态生成的接口代理类无法将查询结果和接口属性做映射,导致返回值全为null。
- 你贴出的Customer实体类未补全
firstName、lastName对应的public getter方法,私有属性无法被JPA读取赋值给投影。
解决方案
第一步:给Customer实体补充getter方法
public class Customer implements Serializable { private static final long serialVersionUID = 8348682056500740593L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private String firstName ; private String lastName; // 新增以下两个getter方法 public String getFirstName() { return firstName; } public String getLastName() { return lastName; } }
第二步:修改Repository层代码,二选一即可
方案1:直接用JPA派生查询(无需写JPQL,改动最小)
@Repository public interface CustomerAccountRepo extends JpaRepository<Customer, Long> { Optional<Customer> findById(Long id); // 直接定义返回投影接口的派生查询,Spring Data自动做字段映射 List<CustomerInter> findAllBy(); }
对应Service层调用方法同步改为调用findAllBy()即可。
方案2:保留现有@Query,给查询字段加匹配别名
@Repository public interface CustomerAccountRepo extends JpaRepository<Customer, Long> { Optional<Customer> findById(Long id); // 给查询字段添加和投影接口属性名完全一致的别名 @Query(value="select c.firstName as firstName, c.lastName as lastName from Customer c") List<CustomerInter> findByFirstNameAndLastName(); }
修改完成后重启项目即可正常返回firstName、lastName的字段值。
内容的提问来源于stack exchange,提问作者wizdemonizer
相关产品推荐
相关产品推荐

