Java Spring Boot下JPQL查询数据库null字段实例化类报错如何解决
问题原因
你遇到的实例化异常根本原因是:Java基本数据类型float不支持null值赋值,当数据库HOURLY_RATE字段为null时,无论是ORM映射到实体类字段,还是实例化返回的POJO对象,都会因为无法将null转换为基本类型触发报错。
此外你提供的JPQL存在语法问题,构造方法的参数列表末尾缺失右括号。
解决方案
方案1:需要返回null值的场景
如果你希望字段为空时返回null,修改字段类型为支持null的包装类即可:
- 修改返回POJO的
hourlyRate字段类型,从float改为Float
@Data @NoArgsConstructor @AllArgsConstructor public class Employee{ private String firstName; private String lastName; // 改为包装类Float,支持null赋值 private Float hourlyRate; }
- 同步修改实体类的
hourlyRate字段类型为Float,避免ORM映射阶段就出错
@Entity @Table(name = "EMPLOYEE") public class Employee implements java.io.Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "EMPLOYEE_ID") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer employeeId; @Column(name = "FIRST_NAME") private String firstName; @Column(name = "LAST_NAME") private String lastName; @Column(name = "HOURLY_RATE") // 改为包装类Float private Float hourlyRate; }
- 修正JPQL的语法错误,补全构造参数的右括号:
@Query("SELECT new com.example.model.response.school.Employee(e.firstName, e.lastName, e.hourlyRate) FROM Employee e " + " WHERE e.employeeId = :employeeId") Employee getEmployeeDetails(@Param("employeeId") int employeeId);
方案2:可接受默认值的场景
如果你业务上允许hourlyRate为空时返回0或者其他固定默认值,可以不修改字段类型,直接在JPQL中使用COALESCE函数处理null值:
@Query("SELECT new com.example.model.response.school.Employee(e.firstName, e.lastName, COALESCE(e.hourlyRate, 0)) FROM Employee e " + " WHERE e.employeeId = :employeeId") Employee getEmployeeDetails(@Param("employeeId") int employeeId);
COALESCE函数会返回第一个非null的参数,当e.hourlyRate为null时就会返回设置的默认值0,即可正常赋值给基本类型float。
内容的提问来源于stack exchange,提问作者eli
相关产品推荐
相关产品推荐

