left join 出现多条重复数据怎么办?Jboot 一行代码解决。

Jboot 一个更简单的分布式、微服务框架。

Jboot是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的微服务框架,帮助开发者降低微服务、分布式开发门槛。爽爽开发,快乐生活。

到目前为止,Jboot 已经开源超过了 5 年的时间,迭代了 200+ 个版本,已经被超过 1000+ 公司在使用,其中包含了多个知名的上市公司,我们了解到的多个使用 Jboot 开发的产品,用户量超过 1亿 以上。

Jboot v3.11.4 在 DAO(Model)添加了一个 distinct() 方法。用于查询的时候,自动添加 distinct 关键字。


例如,有一个文章表,一个分类表,一个文章和分类的关系表。文章和分类是多对多的关系。

如果我们要通过分类来查询文章,Jboot代码如下:

Page<Article> articlePage = DAO.alias("a")
        .leftJoin("article_category_mapping").as("m").on("a.id = m.article_id")
        .paginateByColumns(page, pagesize, baseColumns, "id desc");


此时,分页查询生成的 SQL 如下:

SELECT count(*)  FROM `article` a 
LEFT JOIN `article_category_mapping` AS m ON a.id = m.article_id 
WHERE ...

和

SELECT *  FROM `article` a 
LEFT JOIN `article_category_mapping` AS m ON a.id = m.article_id 
WHERE ...

此时,就可能会出现多条相同的、重复的文章数据....


只需要我们添加 distinct 方法,就能彻底解决,代码如下:

Page<Article> articlePage = DAO.alias("a")
        .distinct("a.id")
        .leftJoin("article_category_mapping").as("m").on("a.id = m.article_id")
        .paginateByColumns(page, pagesize, baseColumns, "id desc");



添加 distinct 方法后,分页查询自动生成的 SQL 如下:

SELECT count(DISTINCT a.id)  FROM `article` a 
LEFT JOIN `article_category_mapping` AS m ON a.id = m.article_id 
WHERE ...

和 


SELECT DISTINCT a.id,a.*  FROM `article` a 
LEFT JOIN `article_category_mapping` AS m ON a.id = m.article_id 
WHERE ...



Jboot v3.11.4 更新内容如下:

  • 新增:重写 Model 的 getBigInteger,防止转换异常

  • 新增:代码生成器 生成的 Model,如果字段是 BigInteger ,自动调用 getBigInteger 方法的功能

  • 新增:新增 DAO.distinct() 方法,findList/分页/findCount 等方法生成的 SQL 自动添加 distinct 关键字

  • 新增:MockMvc 新增 holdCookie 开关配置,用于在不同的单元测试用例里,保持 cookie 的功能

  • 优化:保证 Model 和 Record 的 getBigInteger 的行为一致

  • 优化:移除 codegen 下的 PathKit 类,使用 CodeGenHelpler 代替

  • 优化:升级相关依赖到最新版本

 

Jboot 开发文档:

http://www.jboot.io

同时,Jboot 官方也推出了收费的、企业级快速开发框架 JbootAdmin (如下图所示),真诚的为各位开发者提供一站式、保姆式服务。请咨询海哥。

更多关于 JbootAdmin 请参考:http://jboot.io/jbootadmin/feature.html 

Maven 依赖:

<dependency>
    <groupId>io.jboot</groupId>
    <artifactId>jboot</artifactId>
    <version>3.11.4</version>
</dependency>

Hello World:

@RequestMapping("/")
public class HelloWorld extends JbootController {    

    public void index(){
        renderText("hello world");
    }    
    
    public static void main(String[] args){
        JbootApplication.run(args);
    }
}


评论区