You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:45:04