jpa使用总结

发表于 2024-10-29 |

废话环节

JPA是一种访问数据库的标准,spring data jpa和hibanate都是基于这个标准的一种实现。我工作主要以mybatis为主,个人博客一直在用jpa,所以我想讲一下jpa的一些问题。

不方便的点

我觉得先从缺点讲起比较好一些

多表查询和queryDsl

在jpa里,涉及到多表一般有几种方案

1.注解+手写sql

这种方式一般是放在dao里,但是通常关联查询sql很庞大,放到注解里更是难看

2.利用jpa的一对多和多对一功能

这个自然是指@OneToOne、@OneToMany等等,这就不得不说到懒加载,我之前一直好奇,什么叫用到的时候才加载? 后来发现,spring boot会对返回值做json化处理,所以你所有的返回值他都用到了,所以每次都会多表查询。 于是,我新建了对象,把注解和多表参数都去掉,用对象拷贝的方式返回新对象,果然没有多表查询,但是,这也太麻烦了。

3.queryDsl

queryDsl和ExampleMatcher那一套其实是有点类似的,它真正麻烦的点在于,如果你想要返回一部分参数,你要一个一个的手写上去,例如 paQueryFactory.select(Projections.bean(InyaaBlogVo.class, qBean.id......这种,真的很折磨。

返回值和继承

不知道其他公司怎么样,我司的表关联常见A表存储B表的ID,此时new一个VO去继承Abean,属性就叫Bname,这样可以轻松的完成扩展。 但是jpa是不认可这样的继承关系的,所以你只能用一个完全新的类,把所有需要的属性集成进来。

尾声

其实文章一大半都在说多表查询,问题是实际应用场景的难点大多也都在此,jpa在单表多的项目里真的非常高效,但是一旦多表,便会遇到各种各样的奇怪问题。