在常见场景下:返回数据建议使用map,不建议使用实体对象
/** * 1. 名字包含雨并且年龄小于40 * sql:name like '%雨%' and age < 40 * <p> * 应用场景: * 当表字段非常多,但是你只需要查询少数几列, * 没必要返回的泛型为实体的list,如果返回的泛型为实体,绝大多字段都是null,这样做不优雅 * 用返回泛型为map建议使用 */ @Test public void selectByWrapperMaps() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", "雨").lt("age", 40); //建议使用 List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper); //不建议使用 // List<User> userList = userMapper.selectList(queryWrapper); userList.forEach(System.out::println); } /* sql形式:SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? */
/** * 按照直属上级分组,查询每组的平均年龄。最大年龄、最小年龄。 * 并且只取年龄总和小于500的组 * select avg(age) avg_age,min(age) min_age,max(age) max_age from user * group by manager_id * having sum(age) < 500 ; */ @Test public void selectByWrapperMaps2() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.select("avg(age) avg_age", "min(age) min_age", "max(age) max_age") .groupBy("manager_id") .having("sum(age) < {0}", 500); List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper); userList.forEach(System.out::println); // sql形式:SELECT avg(age) avg_age,min(age) min_age,max(age) max_age FROM user // GROUP BY manager_id HAVING sum(age) < ? }
遇到了这个问题,迷惘,遂问大神,大神曰:如果是组合体,就用map;如果是单体实体,就用实体。实体类对应单表,多表返回用map。
我想省事全用map,但是那我学了面向对象是用来干嘛的?
别人在调用你这个接口的时候 ,如果返回类型是个map,那他需要点进去,看你程序的具体实现才能知道怎么接收,赋值,那无疑是为别人添加了巨大麻烦,尤其是当你的代码不够规范的时候。再有,如果你代码写的很烂,岂不是自己去让别人吐槽你。如果你返回的是一个对象实体,那他就可以看到你返回的是什么,别人也就懒得再去看你代码了,也为他省了很多事。
新技术或者新思想 并不等于 省事 ,很多时候 有捷径,但是,我们就是不能去走,为什么?说不定走到哪里就会遇到一个坑,或者直接是悬崖也不一定。
其他回答:
1.每张表都要对应一个实体 这样才能映射嘛 多表联合查询的结果可以返回一个hashmap处理 视情况而定。
2.如果你是多表联合查询,然后你又觉得返回方式用map很麻烦的话,你可以自己建立个实体类,这个实力类中包含有你所要查询的多表中的字段,然后在mybatis中用typeAlias指定一下,到时候,就能像用一般的实体类那样使用就好。
3.如果类型指定为hashMap只是针对返回一条记录的情况吧,如果返回多条记录类型就不能指定为hashMap了?多个结果集他会给你放入一个List,你在javacode中用selectList这样的代码返回的是list,当然这个list中可能是实体类也可能是hashmap。
到此这篇关于MyBatis-Plus 查询返回实体对象还是map的文章就介绍到这了,更多相关MyBatis-Plus 查询返回内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
我在当前项目中使用QueryDSL,在一个实例中,由于jpql的限制,我需要使用本机查询而不是jpa查询。 值得庆幸的是,通过从切换到可以很容易地从一个实体切换到另一个实体并保留api抽象层,但是在我这样做之后,实体不再映射为结果类型。 示例: 使用: 将生成适当的实体作为结果类型: 但是 有没有办法强制返回实体而不手动映射它们? 使用query_dsl_version=4.2.1的Im TLDR
问题内容: 我在我的项目中使用spring data JPA。我正在玩数百万条唱片。我有一个要求,我必须获取各种表的数据并构建一个对象,然后将其绘制在UI上。现在如何实现我的Spring数据存储库。我读过它可以通过命名本机查询来实现。 如果命名的本机查询未返回实体或实体列表,则可以使用@SqlResultSetMapping批注将查询结果映射到正确的返回类型。 但是,当我尝试使用它时,将采用另一个
我正在我的项目中使用Spring Data JPA。我在玩数百万张唱片。我有一个要求,我必须为各种表获取数据,构建一个对象,然后在UI上绘制它。现在如何实现我的spring数据仓库。我读过,它可以通过命名的本机查询来实现。 如果命名的本机查询没有返回实体或实体列表,我们可以使用@SqlResultSetMapping注释将查询结果映射到正确的返回类型。 但是当我试图使用时,它会使用另一个Entit
null 这似乎意味着我不像使用简单的“From customer”查询那样获取customer实体的实例。如果是这种情况,如何返回客户实体?如果没有,那我做错了什么?
问题内容: 我正在写一个跨三个表的JPQL查询。在我的结果列表中,我想获得每个匹配行的所有三个实体(希望如此)。 有任何想法吗? Hibernate 3.x是我的JPA提供程序。 问题答案: IIRC,您可以执行,结果将是,其中数组内容将包含o1,o2,o3值。
我有JPA持久实体wjich有50个字段。有时我需要将所有50个字段显示到用户界面,或者有时比这少得多。 我能想到两种方法 方法1:- 我将继续将实体返回到UI。有一些方法(带有注释)可以让我提到需要返回下的哪些特定字段 例子:- 如果我想在将json返回到浏览器之前忽略Employee类中的,我将创建,其中包含所需的,如下所示 方法2:- 我将制作新的POJO,再次包含所有5o字段,并返回到UI