今天在写项目的JPA查询遇到的一个坑,分享一下。
之前我直接返回Users对象,代码:
@Query("select Users from Users as u , Students as s " +
"where u.password = ?2 and s.studentId = ?1 and s.userId = u.userId")
Users findByStudentIdAndPassword(String id, String password);
发现报错了,信息:
Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract per.agreysky.SIMS.dataObject.Users per.agreysky.SIMS.repository.StudentsRepository.findByStudentIdAndPassword(java.lang.String,java.lang.String)!
我当时没想到什么原因,就改成了:
@Query("select u.userId from Users as u , Students as s " +
"where u.password = ?2 and s.studentId = ?1 and s.userId = u.userId")
int findByStudentIdAndPassword(String id, String password);
通过userId来判断数据库中是否有字段。这样虽然正确用例过了,但给出错误用例时会抛出空指针异常。
经过查阅后发现原因出HQL语句查询先查询出对象,当查询为空时,意味着Users为空,那此时调用Users的userId属性显然不行,于是抛出了空指针异常。
然后,我又对之前的错误进行查阅,发现HQL进行查询时,不能同名,我最开始的代码select Users from Users两个Users同名,改为select u from Users as u即可。
此时再次运行成功。