HQL调用EntityManager.createQuery时CaseInsensitiveComparator.compare抛出NPE
根因定位
触发空指针的核心原因是HQL语法不规范,导致Hibernate解析查询语句时标识符匹配失败,具体错误点如下:
- 第二个子查询中
JerseyEntity未声明别名,直接使用实体类名引用jerseyid字段不符合HQL语法要求,Hibernate无法识别该标识符归属 - 过滤条件中的
starttime字段未指定所属实体别名,Hibernate无法匹配到对应的实体属性 - 外层
FROM TeamEntity无过滤条件,会返回与Team表行数相同的重复统计结果,外层DISTINCT在此场景下无实际作用
修正方案
按实际业务映射补全别名、指定字段归属即可,参考修正代码如下:
// 假设starttime属于AssignmentsEntity,可根据你的实际实体字段归属调整别名 Query query = em.createQuery("SELECT " + "(SELECT count(*) FROM TeamEntity t, AssignmentsEntity a, JerseyEntity p " + "WHERE t.id = a.teamid AND p.jerseyId = a.jerseyid AND t.id = :teamId), " + "(SELECT count(*) FROM TeamEntity t2, AssignmentsEntity a2, JerseyEntity p2 " + "WHERE t2.id = a2.teamid AND p2.jerseyid = a2.jerseyid AND t2.id = :teamId " + "AND a2.starttime > 0) " + "FROM TeamEntity t WHERE t.id = :teamId"); query.setParameter("teamId", teamId);
如果只需返回一行统计结果,也可直接去掉外层TeamEntity查询,使用createNativeQuery执行原生SQL实现,性能更优。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

