Consulta de tabla conjunta MyBatis-Plus, consulta difusa y paginación

1.Configuración de 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.Servicio

/**
 * 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. Instrucciones de paginación y búsqueda difusa:

    //和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 Descripción del atributo

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

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

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

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

Es equivalente a escribir 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 ?

Aquí hay un detalle en el campo de devolución al que debes prestar atención.

Lo que estoy haciendo aquí es una consulta conjunta de tres tablas. Los campos en t1, t2 y t3 se devuelven al bean de t. Estos campos recién devueltos se agregan al domian y dto de t.
Capa de dominio: Se suele utilizar para colocar JavaBeans en este sistema que corresponden a tablas de la base de datos. Por lo tanto, los campos agregados en domian no están en la base de datos y se informará un error al realizar la consulta. Debe usar @TableField (exist = false) para manejarlo:

La anotación @TableField (exist = false) puede resolver el problema de las tablas en las tablas. Al cargar propiedades de bean, significa que la propiedad actual no es un campo de base de datos, pero debe usarse en el proyecto. Esto se puede usar para generar una tabla de datos como campo. , Se utiliza para realizar la salida de datos de la tabla en tablas. Con esta configuración, mybatis-plus ignorará esto al agregar nuevos beans.

/**
 * 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 Búsqueda difusa y precisa, volver a paginación

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);

Supongo que te gusta

Origin blog.csdn.net/u010797364/article/details/130677543
Recomendado
Clasificación