MyBatis-Plus ジョイント テーブル クエリ、ファジー クエリ、およびページング

1.Maven 構成:

    <!-- mybatis-plus join连表查询-->
    <dependency>
        <groupId>com.github.yulichang</groupId>
        <artifactId>mybatis-plus-join</artifactId>
        <version>1.2.4</version>
        <exclusions>
            <exclusion>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>com.github.yulichang</groupId>
        <artifactId>mybatis-plus-join</artifactId>
        <version>1.2.4</version>
    </dependency>

2.サービス

/**
 * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.changecontrol.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.jeeplus.changecontrol.domain.ChangeControl;
import com.jeeplus.changecontrol.domain.ChangeEvaluation;
import com.jeeplus.changecontrol.mapper.ChangeEvaluationMapper;
import com.jeeplus.changecontrol.service.dto.ChangeControlDTO;
import com.jeeplus.changecontrol.service.dto.ChangeEvaluationDTO;
import com.jeeplus.sys.domain.Office;
import com.jeeplus.sys.domain.User;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import javax.annotation.Resource;

/**
 * 变更评估表Service
 * @author lgn
 * @version 2023-05-06
 */
@Service
@Transactional
public class ChangeEvaluationService extends ServiceImpl<ChangeEvaluationMapper, ChangeEvaluation> {
    @Resource
    private ChangeEvaluationMapper changeEvaluationMapper;

    /**
     *
     * @author lgn
     * @date 2023/5/6 16:42
     * @param changeEvaluationDTO
     * @param page
     * @return ChangeEvaluation
     */
    public Page<ChangeEvaluation> getEvaluationList(ChangeEvaluationDTO changeEvaluationDTO, Page<ChangeEvaluation> page) {
        //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用
        MPJLambdaWrapper<ChangeEvaluation> wrapper = new MPJLambdaWrapper<ChangeEvaluation>()
                .selectAll(ChangeEvaluation.class)
                .select(ChangeControl::getNumber)
                .select(ChangeControl::getName)
                .select(ChangeControl::getChangeCategory)//类别
                .select(ChangeControl::getChangeGrade)//分级
                .selectAs(User::getName, ChangeControlDTO::getUserName)//申请人名称
                .selectAs(Office::getName,ChangeControlDTO::getOfficeName)//部门名称
                .leftJoin(ChangeControl.class,ChangeControl::getId,ChangeEvaluation::getChangeControlId)
                .leftJoin(User.class,User::getId,ChangeControl::getPreparationUserId)
                .leftJoin(Office.class,Office::getId ,User::getOfficeId)
                .orderByDesc(ChangeEvaluation::getCreateTime);

        if (StringUtils.isNotEmpty(changeEvaluationDTO.getNumber())){
            wrapper.like(ChangeControl::getNumber,changeEvaluationDTO.getNumber());
        }
        if (StringUtils.isNotEmpty(changeEvaluationDTO.getName())){
            wrapper.like(ChangeControl::getName,changeEvaluationDTO.getName());
        }
        if (StringUtils.isNotEmpty(changeEvaluationDTO.getProcessStatus())){
            wrapper.eq(ChangeEvaluation::getProcessStatus,changeEvaluationDTO.getProcessStatus());
        }
        return page(page, wrapper);
    }

    /**
     * 查看详情
     * @author lgn
     * @date 2023/5/9 16:25
     * @param id
     * @return ChangeEvaluation
     */
    public ChangeEvaluation getEvaluationInfo(String id) {
        //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用
        MPJLambdaWrapper<ChangeEvaluation> wrapper = new MPJLambdaWrapper<ChangeEvaluation>()
                .selectAll(ChangeEvaluation.class)
                .select(ChangeControl::getNumber)
                .select(ChangeControl::getName)
                .select(ChangeControl::getChangeCategory)//类别
                .select(ChangeControl::getChangeGrade)//分级
                .selectAs(User::getName, ChangeControlDTO::getUserName)//申请人名称
                .selectAs(Office::getName,ChangeControlDTO::getOfficeName)//部门名称
                .leftJoin(ChangeControl.class,ChangeControl::getId,ChangeEvaluation::getChangeControlId)
                .leftJoin(User.class,User::getId,ChangeEvaluation::getPreparationUserId)
                .leftJoin(Office.class,Office::getId ,User::getOfficeId).eq(ChangeEvaluation::getId,id);

        return changeEvaluationMapper.selectOne(wrapper);
    }

}

3. ページネーションとあいまい検索の手順:

    //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用
    MPJLambdaWrapper<ChangeEvaluation> wrapper = new MPJLambdaWrapper<ChangeEvaluation>()
            .selectAll(ChangeEvaluation.class)
            .select(ChangeControl::getNumber)
            .select(ChangeControl::getName)
            .select(ChangeControl::getChangeCategory)//类别
            .select(ChangeControl::getChangeGrade)//分级
            .selectAs(User::getName, ChangeControlDTO::getUserName)//申请人名称
            .selectAs(Office::getName,ChangeControlDTO::getOfficeName)//部门名称
            .leftJoin(ChangeControl.class,ChangeControl::getId,ChangeEvaluation::getChangeControlId)
            .leftJoin(User.class,User::getId,ChangeControl::getPreparationUserId)
            .leftJoin(Office.class,Office::getId ,User::getOfficeId)
            .orderByDesc(ChangeEvaluation::getCreateTime);

3.1 属性の説明

selectAll():查询指定实体类的全部字段。

select():查询指定的字段,支持可变长参数同时查询多个字段,但是在同一个select中只能查询相同表的字段,所以如果查询多张表的字段需要分开写。

selectAs():字段别名查询,用于数据库字段与接收结果的dto中属性名称不一致时转换。

leftJoin():左连接,其中第一个参数是参与联表的表对应的实体类,第二个参数是这张表联表的ON字段,第三个参数是参与联表的ON的另一个实体类属性。

これは SQL を記述するのと同じです。

SELECT
	t.id,
	t.change_control_id,
	t.pdf_template_file,
	t.process_status,
	t.is_estimate,
	t.is_evaluation,
	t.approval_date,
	t.preparation_department,
	t.preparation_user_id,
	t.preparation_date,
	t.create_time,
	t.create_by_id,
	t.update_time,
	t.update_by_id,
	t.del_flag,
	t1.number,
	t1.NAME,
	t1.change_category,
	t1.change_grade,
	t2. NAME AS userName,
	t3. NAME AS officeName
FROM
	tb_change_evaluation t
LEFT JOIN tb_change_control t1 ON (t1.id = t.change_control_id)
LEFT JOIN sys_user t2 ON (
	t2.id = t1.preparation_user_id
)
LEFT JOIN sys_office t3 ON (t3.id = t2.office_id)
WHERE
	t.del_flag = 0
AND (t1. NAME LIKE ?)
ORDER BY
	t.create_time DESC
LIMIT ?

ここの返品フィールドには注意すべき詳細があります。

ここで行っているのは 3 つのテーブルの結合クエリです。t1、t2、および t3 のフィールドは t の Bean に返されます。これらの新しく返されたフィールドは、t の domian および dto に追加されます。
ドメイン層: 通常、データベース内のテーブルに対応する JavaBeans をこのシステムに配置するために使用されます。したがって、domian に追加されたフィールドはデータベースに存在せず、クエリ時にエラーが報告されます。これを処理するには @TableField(exist = false) を使用する必要があります。

@TableField(exist = false) アノテーションは、テーブル内のテーブルの問題を解決できます。Bean プロパティをロードする場合、現在のプロパティはデータベース フィールドではありませんが、プロジェクトで使用する必要があることを意味します。これは出力に使用できます。フィールドとしてのデータ テーブル。テーブル内のテーブル データの出力を実現するために使用されます。この設定を使用すると、mybatis-plus は新しい Bean を追加するときにこれを無視します。

/**
 * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.changecontrol.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeeplus.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * 变更评估表Entity
 * @author lgn
 * @version 2023-05-06
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_change_evaluation")
public class ChangeEvaluation extends BaseEntity {
	private static final long serialVersionUID = 1L;
	/**
     * 变更评估表id
     */
	private String changeControlId;
	private String pdfTemplateFile;
	/**
	 * 流程状态:0-审批中,1-已完成,2-审批不通过,3-不需审批
	 */
	private String processStatus;

	/**
	 * 是否需要评估
	 */
	private String isEstimate;

	/**
	 * 是否为已评估数据:0-否,1-是
	 */
	private String isEvaluation;

	/**
	 * 批准日期
	 */
	private String approvalDate;

	/**
	 * 编制部门id
	 */
	private String preparationDepartment;

	/**
	 * 编制人id
	 */
	private String preparationUserId;

	/**
	 * 编制日期
	 */
	private String preparationDate;
	/**
	 * 变更编号
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String number;

	/**
	 * 变更类别n
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String changeCategory;

	/**
	 * 变更名称
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String name;
	/**
	 * 变更分级
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String changeGrade;
	/**
	 * @author lgn
	 * @date 2023/5/5 11:30
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String userName;

	/**
	 * @author lgn
	 * @date 2023/5/5 11:30
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String officeName;
}

3.2 あいまい検索と正確な検索、ページングに戻る

if (StringUtils.isNotEmpty(changeEvaluationDTO.getNumber())){
    wrapper.like(ChangeControl::getNumber,changeEvaluationDTO.getNumber());
}
if (StringUtils.isNotEmpty(changeEvaluationDTO.getName())){
    wrapper.like(ChangeControl::getName,changeEvaluationDTO.getName());
}
if (StringUtils.isNotEmpty(changeEvaluationDTO.getProcessStatus())){
    wrapper.eq(ChangeEvaluation::getProcessStatus,changeEvaluationDTO.getProcessStatus());
}
return page(page, wrapper);

おすすめ

転載: blog.csdn.net/u010797364/article/details/130677543