在使用jpa时遇到一个报错困扰了我许久,报错的大致意思是找不到查询的字段。
在网上搜了一圈之后大致有两种原因:一是实体类中未添加相应的注解;二是实体类中的字段名可能写错了,和数据库对不上。
我首先采用了原因一的解决方案,添加了注解(但其实没有必要,因为新版本中该注解是默认的,一般不用写),结果并没有用。
然后我又对比了数据库和实体类的字段名,并没有对不上,而且我是通过数据库逆向生成的实体类,也不应该出错。
再后来我测试对另一个实体类进行测试,竟然不报错,我百思不得其解。都是逆向生成的,凭什么你可以不报错???!!!
再到后来我想起我搜到的一个帮助,出了提供解决方法外,最后还带了一句“如果你认真查看报错信息的话,应该早就解决了”。虽然他的解决方法没有起作用,但我记住了这句话。我决定再仔细看看报错信息(我一般很少看报错信息,都是直接复制搜索,这确实是一个不好的习惯)。终于在jpa的sql语句中发现了倪端。
真正的报错原因:拉回正题,在jpa的sql语句中,我发现查询的字段并不是我实体类当中所写的字段,或者说并不完全是。这里就要说到数据库的字段命名方式了。我都是采用的和代码中相同的“驼峰命名”,但是数据库中是不区分大小写的,所以并不适合驼峰命名,“Abc”和“abc”其实是同一个字段,Jpa也是考虑到了这一点,所以在查询数据库时,会自动将实体类中驼峰命名的字段改为用下划线隔开的的方式。例如“managerName”==>“manager_name”。上面说到的不报错的实体类就是因为它的字段名比较短,只有一个单词,所以不会报错。
总结:1、要多看报错信息;2、数据库的字段命名中应该使用下划线隔开的方式命名。