在repository中写@Query(“”)自定义sql,启动项目发现报错。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.demo.bean.Person com.demo.repository.PersonRepository.findPerson(int)!
查了好多,网上说了好多但都不是这个问题。最后发现问题所在,写@Query自定义sql时
select * from 表名
,由于hibernate是与实体类是强关联的。所以这里sql中的表明应该要写对应实体类的类名,如我的实体类名为Person。改为
select * from Person
就好了。
但是这样写总是感觉不是很舒服,还是觉得sql就是写原生的sql语句舒服,那么就需要在实体类中加注解@Table,其中@Table是对应的数据库表明,@Column对应的是字段名。
然后需要在sql后面加上 nativeQuery = true
@Query(value="select t.name,count(t.name) from person t where t.id = ?1",nativeQuery = true)
最后启动成功后,如果调用接口发现报错
java.sql.SQLException: Column 'id' not found.
排除数据库没有该字段的问题。那么出现这个问题的原因就是因为hibernate是强关联实体类的。由于查询语句查出来的字段并不是全部的,那么就会报错找不到字段。解决办法是将返回类型改为Object。然后再根据业务需求转为实体对象。
我这里用的JSONObject接收的。