首頁 > 軟體

Mybatis-Plus條件構造器select方法返回指定欄位方式

2022-06-27 10:00:07

條件構造器select方法返回指定欄位

條件構造器select用法

1.返回特定的幾個欄位 select(欄位…)

2.排除某幾個欄位 select(entiyClass,predicate判斷)

3.分組聚合函數 select(“聚合函數”)

搭配service的.listMaps方法,將返回的資料封裝到map中避免了多餘欄位的返回

範例

說明 :以下程式碼中 iProjectBuildService實現了mybatis-plus的service介面

範例一:指定需要查詢的具體欄位

public AjaxResult listAll(ProjectBuild projectBuild) {
    //只返回了id和name兩個欄位    
    List<Map<String,Object>> list = this.iProjectBuildService.listMaps(
           Wrappers.lambdaQuery(projectBuild).select(ProjectBuild::getBuildId,ProjectBuild::getBuildName)
           .orderByAsc(ProjectBuild::getBuildId)
           // 以上select表示要返回的欄位,
    );
    return AjaxResult.success(list);
}

範例二:排除不需要返回的欄位

@Test
public void selectByQueryWrapper8(){
    QueryWrapper<Employee> queryWrapper=new QueryWrapper();
 
    queryWrapper.lambda()
             .select(Employee.class,fieldInfo->!fieldInfo.getColumn().equals("birthday")&&!fieldInfo.getColumn().equals("gender"))
             .gt(Employee::getSalary,3500)
             .like(Employee::getName,"小");
    List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
    System.out.println(employeeList);
}

範例三:返回聚合函數值

sql實現:

SELECT departmentId,AVG(salary) AS avg_salary FROM t_employee GROUP BY department_id;
@Test
public void selectByQueryWrapper9(){
    QueryWrapper<Employee> queryWrapper=new QueryWrapper();
  
    queryWrapper.select("department_id","AVG(salary) AS avg_salary")
             .groupBy("department_id");
    List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
}

問題解決

問題描述: map中的key沒有使用駝峰命名

解決方法: 使用hutool工具包中的 MapUtil.toCamelCaseMap(map);

//處理map中key未駝峰命名
list = list.stream().map(MapUtil::toCamelCaseMap).collect(Collectors.toList());

Mybatis-Plus修改指定欄位

通用解決方案

以此做法為例,如果需要多條件匹配,可以自行新增方法處理

// 繼承原來的公共mapper
// java8 interface可以寫方法的實現邏輯,直接在這裡寫好,
// 其他地方呼叫時直接繼承自定義的 mapper
public interface CustomBaseMapper<T> extends BaseMapper<T> {
 
    /**
     * 目前僅支援主鍵/屬性為 id的更新
     * @param dirtyFields: 指定更新的屬性
     */
    default int updateById(@Param("et") T entity, List<String> dirtyFields) {
        Class<?> tClass = entity.getClass();
        UpdateWrapper<T> wrapper = new UpdateWrapper<>();
        try {
            Object id = ObjectUtils.getAttrVal(entity, "id"); // 獲取物件的主鍵值
            wrapper.eq("id", id);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new RuntimeException("物件主鍵未找到,請確認"); // 自定義異常
        }
 
        for (String dirtyField : dirtyFields) {
            try {
                Field classField = tClass.getDeclaredField(dirtyField);
                classField.setAccessible(true);
                // 物件屬性,轉成資料庫欄位
                wrapper.set(StringUtils.toColumn(dirtyField), classField.get(entity));
            } catch (Exception ignored) {
            }
        }
        return update(null, wrapper);
    } 
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com