Spring Data JPA查询返回自定义类型对象字段为null问题排查
问题排查与解决方案
嘿,这个问题我之前也碰到过!你能拿到正确的记录数,但getValue()始终返回null,核心原因是原生查询的列别名和自定义接口IIntegerReportData的方法名没匹配上,JPA找不到对应的映射关系,自然就返回null了。
具体问题在哪
先看你的SQL语句:
select client_id , count(*) from visit where (DATE(jhi_date) between :startDate and :endDate) group by client_id
再看你的接口方法:
Long getId(); Integer getValue();
JPA把原生查询结果映射到自定义接口时,是靠列别名和方法名的对应关系来工作的:
- 接口里的
getId()会去找查询结果里别名为id的列; getValue()会去找别名为value的列。
但你的SQL里,client_id没有别名成id,而且count(*)甚至没有别名!这就导致JPA没法把查询结果和接口方法对应起来,所以getValue()拿不到值,只能返回null。
怎么改
很简单,给SQL里的列加上正确的别名就行:
select client_id as id, count(*) as value from visit where (DATE(jhi_date) between :startDate and :endDate) group by client_id
这里:
client_id as id对应接口的getId()方法;count(*) as value对应接口的getValue()方法。
改完之后,再调试你会发现visit.getValue()就能正确拿到数据库里的计数结果了。
额外提醒
JPA的这个映射逻辑其实很灵活,比如如果你的接口方法是getClientId(),那SQL里的别名可以是client_id或者clientId(JPA会自动处理下划线和驼峰的转换),但既然你的接口定义的是getId(),那就必须把client_id别名为id才能匹配上。
内容的提问来源于stack exchange,提问作者harp1814
相关产品推荐
相关产品推荐

