欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JPA自定义对象接收查询结果集操作

程序员文章站 2022-04-09 12:06:09
最近使用jpa的时候,碰到需要自定义查询结果集的场景,网上搜了一下,都是需要自定义方法写一大串代码实现的,太繁琐了,有那时间还不如用mybaits。用jpa就是要尽量通过声明接口解决持久层问题,要不然...

最近使用jpa的时候,碰到需要自定义查询结果集的场景,网上搜了一下,都是需要自定义方法写一大串代码实现的,太繁琐了,有那时间还不如用mybaits。

用jpa就是要尽量通过声明接口解决持久层问题,要不然鬼用。逼得没办法去了官网看看文档,再没有就放弃了,没时间看源码。最终找到我想要的结果了。

例如,传统的jpa接口实现如下所示:

自定义对象接收查询结果集方法如下:

(1)增加接收数据接口

(2)增加持久层接口

如果要对查询结果进行序列号的话就会有点问题:

会出现targetclass这个字段,不能直接把结果拿来用,很恶心,又不想写代码中转下。

经过后来的摸索,其实如果只是为了返回json,也可以直接在repository层直接用list<map<string,object>>来返回,

map<string,object>对应单条查询结果,完美解决序列化问题。

完毕。就这么简单。

补充:springboot jpa查询结果映射到自定义实体类

场景

举一个简单的例子:

比如有一个position实体类

然后有一个positiondetail实体类

需求:

查询职位基本信息,职位描述,因为涉及到两张表操作,简单的查询并不能满足我们的需求,因此就需要自定义查询接口并返回符合需求的结果。

接下来再定义一个实体类,用来接收查询结果

编写dao接口,用来实现crud操作

思考:

如果这样写会不会出现问题?接下来我们编写一个测试类测试一下。

哈哈,翻车了吧,还好先测试了一波,问题不大。

分析原因:

那么到底是为什么造成这样的原因呢?相信小伙伴们一眼就能看出来了,是因为jpa找不到能够从类型转换的转换器,而抛出这样的异常。

现在问题来了,既然这样不行,那么我们想要实现映射到自定义结果集该如何实现呢?

实现:

jpa可以自定义sql语句进行查询,然后查询语句可以通过原生sql语句(原生sql语句也就是在@query注解里加上nativequery = true)进行查询。当然了,也可以通过jpql进行查询。

我们这里就是通过jpql进行查询,它的特征就是与原生sql语句类似,完全面向对象,通过类名和属性访问,而不是表名和表属性。

由此positiondao修改之后就像这样

接下来我们再运行测试方法看一下。

ok了,结果已经正确查询出来。

总结:

注意上面的sql语句是面向对象的,对应的字段也都是实体类里面的属性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。