日常踩坑_jpa的踩坑心得

背景提要

使用jpa的出现了很多问题
1、使用between做日期范围查询时报错
2、使用@Query注解写原生sql时报错
3、使用@where注解自动在sql后添加条件时查不出东西
4、数据库中的字段采用的是驼峰命名法

解决

1、使用between做日期范围查询时,要注意两点
一是between的范围是左闭右开,意思就是如果你要查询的时间范围是2022-06-22到2022-06-27时,实际查出的数据是2022-06-22到2022-06-26的数据,27号的数据没有被放入,所以截止日期应该加一天

在这里插播一下 Calendar,当你使用 Calendar.MONTH来获取月份时,会发现比实际月份少一个月,因为 Calendar.MONTH是从0开始的,所以如果想要获得正确的月份,需要+1操作

二是使用jpa的语法做between时,时间需要是Date类型,而不能是String类型,和原生sql有一些区别

2、使用@Query的写原生sql的时候
一要注意加 nativeQuery = true,这个就老生长谈了

二要注意原生sql的参数问题,其实也是可以用@Param注解的,我一直以为原生的只能用?来占位,但?占位的时候,变量名需要和实体类中的一致,否则一直会报找不到该字段的错

这是正确用法

日常踩坑_jpa的踩坑心得

3、使用@where注解自动在sql后添加条件时查不出东西
我在实体类上加了注解 @Where(clause = "delete_ind=N"),这个注解在查询数据库的时候会自动以and的方式加上条件delete_ind=N

但加了之后一直在报错,报错信息是找不到N字段,也就是说在这里它并不将N看作一个字符,而是看作一个表的字段去匹配的,所以实际的写法是 @Where(clause = "delete_ind='N'"),即用单引号标注N是字符而不是字段

4、数据库表的字段用的是驼峰命名法,所以在使用jpa的时候,一直在报错,一直显示没有该字段
说到这个我就很生气,到现在还有人在建表的时候字段命名都不规范,希望这类人不要再做程序员了好吧
然后我就死活都查不出来这个数据,打印sql一看,好家伙,原来是jpa自动把实体类的驼峰命名法解析成了下划线。
说一下解决历程吧,真是心累:
①、想通过@Column来标注一下实际的字段映射,但没有用,实际查表的时候字段还是会被解析成下划线格式的
②、想着用@Query写原生的sql来查询,但没有用,结果集对不上了
实际的解决办法,jpa还是强啊,自己有一个配置项,可以确定你的字段到底是什么格式的,在yml文件里增加jpa配置项

spring:
  jpa:
    hibernate:
      naming:
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

但这个的配置项有一个要求,你的数据库中所有使用jpa的表都是驼峰命名法,因为它会对所有表都生效
但好死不死,我的数据库里大多都是下划线命名,但极个别表是驼峰命名法,这时这个配置项就没什么作用了,甚至会导致我下划线命名的表都用不了
最终,我选择了去手动改表的字段名
希望大家创建表的时候都能规范命名,替像我一样的小白程序员谢谢各位了

跳坑结束,祝你快乐!

Original: https://www.cnblogs.com/deanCopy/p/16401900.html
Author: Dean_001
Title: 日常踩坑_jpa的踩坑心得

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714937/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球