spring data jpa遇到的一些琐碎问题

jpa是几年前就已经接触过了,不过中间隔了好久没使用过,忘了不少细节上的问题。今天就来分享下在项目中遇到的一些坑吧,应该都比较基础,注意就好。
1.对象与表的映射。
全程采用注解形式,对象中的字段可以根据数据表的字段进行定义,但是在建数据表的时候要保证数据表字段都要是大写,否则在关联关系(如:一对多,多对一,多对多等)上一直会出错,说找不到对应的列。对于对象的get、set方法,可以直接采用简便的@Data在类上进行标注即可,然后在属性上添加字段的映射注解。


2.对象的构造方法的注入
很多时候,我们会根据业务来写HQL,但是HQL自身的功能有限不能完全满足业务,我们会根据需要来查询对象,有的时候要查询一张数据表中不存在的字段,这时候要在对象中添加需要的属性,并且要给该属性添加@Transient注解,同时给该对象添加一个构造方法public User(Long id,String deptName) { this...省略},显然默认的构造方法一定要加上public User() { },这样就可以实现多个对象的关系关联,查询的时候就可以这样select new User(u.id,d.deptName) from User u,Dept d where u.deptId = d.id;


3.聚合函数在构造器中的注入

在业务统计的时候,会涉及到一些数据的统计。这时候数据库的sum,count,avg等函数就要被派上用场,但在对象模型中,并不完全跟数据库写法一样。首先,在对象中定义sum的属性要是Long型的,count的可以是Long,也可是Integer,同时要给该属性加上@Transient注解,因为它在数据表中不存在,只是一个临时变量,建立构造器public Course(Long userId,Integer level,Long total){this...省略}。其次,在查询语句中我们会根据不同条件或维度来统计结果,如select  new Course(u.userId,case when u.level is null then  0 else u.level,sum(case when c.score>=90 then 1 when c.score <90 and c.score>=80 then 1 when c.score <80 and c.score>=60 then 1 when c.score<60 then 1 else 0 end )) from Course c,User u where c.UserId=u.id group by u.userId,case when u.level is null then  0 else u.level;问题有两个:1、为什么给level加case when判断呢,因为有时候会产生脏数据,一旦数据为空,查询的时候会报javax.servlet.ServletException: null ,这个问题还真不好找;2、为什么在sum里面使用case when,那是因为hql不支持decode这个函数,所以要使用该函数。


4.使用EntityManager执行原生sql
有的时候,业务很复杂的情况下,我们还是要采用原生sql完成该业务,首先添加这个两个注解@Transactional @Service在类上,然后在把@PersistenceContext private EntityManager em;写入该类全局属性,如果是查询的话,这个比较容易,直接写sql,创建Query,然后查出结果集;如果是增删改,需要在相应的类上加上@Modifying注解,
如@Modifying public void batchInsert(){}。有@Transactional的情况下,事务是满足原子性、一致性、隔离性、持久性的特点,如果哪里出错,会同时提交或回滚。可以借助于try{}catch(){}来实现不同时进行,具体可以自行尝试,这里就不多说了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值