最近使用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语句是面向对象的,对应的字段也都是实体类里面的属性。

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