之前在个人项目中用到了 jpa 来作为持久层,优点很明显,前期基础功能的开发很快,api 也简单易懂。
在涉及到一些多表的关联查询时,目前是通过 JpaSpecificationExecutor 接口提供的功能来实现,代价是让实体做了多层嵌套
//例如部门和员工,一对多的关系
public class Department {
}
public class Employee {
...
@ManyToOne
private Department department;
...
}
这样嵌套之后,问题也很明显。比如要新增一条数据
public void addEmployee(){
Employee employee = new Employee();
Department department = new Department();
department.setId(666);
employee.setDepartment(department);
save(employee);
}
明显代码不够美观,还存在很多空指针的隐患。
想请教一下针对 jpa 的多表查询,有没有更好的实现方式?要求是,操作能完全面向对象,代码尽量简洁。
希望能得到一些建议,谢谢。
1
zhenjiachen 2019-12-05 12:39:12 +08:00
你这是保存把?保存不会报空指针把?查询可以使用 querydsl,很方便,使用 @QuerydslPredicate 还可以和 SpringMvc 结合使用。
http://www.querydsl.com/static/querydsl/4.1.3/reference/html_single/ |
2
should 2019-12-05 12:41:02 +08:00
可以看看这个项目,挺好用的还是 https://github.com/blinkfox/fenix
|
3
limingjie138 2019-12-05 13:42:54 +08:00
|
4
limingjie138 2019-12-05 13:44:38 +08:00
|
5
joooooker21 OP @zhenjiachen @should 好的,我去了解一下
|
6
joooooker21 OP @limingjie138 如果要构建动态查询,example 实现起来不是很方便
|
7
geying 2019-12-05 15:54:22 +08:00
前两天用了 jpa,前期用着很方便,后期需要更新字段,复杂查询就感觉很难受,还有几个级联注释搞不明白
然后换了 mybatis-plus,舒服了 |
8
lau52y 2019-12-05 20:50:59 +08:00 via iPhone
简单还行,复杂都是写 sql,有时候,因为公司大部分不是单表能搞定的,很多业务表关联
|
9
skypyb 2019-12-06 08:55:15 +08:00 via Android
所以问题来了。要是涉及到复杂 sql,jpa 怎么处理?比如那种连多表+分组排序之类的。
只能手写 sql 吧。那 jpa 能配 xml 来写么 |
11
joooooker21 OP @lau52y 是的,写 sql 如果要兼容动态查询的话,好像 jpa 就无解了
|
12
zhazi 2019-12-07 16:07:46 +08:00 via Android
那么问题来了,怎样算美?
部门招人不需要通过部门同意吗? |
13
PoetAndPoem 2019-12-09 16:29:37 +08:00
我觉得没问题,ORM 就是这样的。
代码美观通过重构实现, 至于 NPE, 你只是 setId 用 sql 来写,其他 property 的 getter 就不报 NPE 了吗。 |