解决查询一个未知的表,未知的字段,并接收返回

本文介绍了如何使用MyBatis查询数据库中指定字段为空的数据,并处理MyBatis-plus的null值返回问题,包括对象接收、SQL构建、配置调整等步骤。

在做项目时候,我需要进行查询一个未知的表,而且不止一个表,这也是我第一次做,于是我便记录了一下

我先分析一下,MyBatis会返回我什么数据?对象?对象格式是什么?我应该怎么接收?

对象格式是键值对的,字段名:值 所有我们应该用map来接收,所以就是Map<String,Object>

查询的数据不可能是一个对象,所以应该用List,结合map,我们的格式就是List<Map<String.Object>>,返回值问题解决;

既然最难的问题解决了,那么我们直接开始查询我先上Controller代码

@GetMapping("/你的路径")
@ApiOperation(value = "查询指定字段为空的表数据")
@ApiImplicitParams({
        @ApiImplicitParam(name = "schemaName",value = "数据库名称(String)" , dataType = "String", paramType = "query"),
        @ApiImplicitParam(name = "tableName",value = "数据表名称(String)" , dataType = "String", paramType = "query")
})
public List<Map<String,Object>> findDataColumn(String schemaName,String tableName){
    //拼接一下sql查询  数据库名称.数据表   这样可以跨数据库查询
    String schemaTable =schemaName+"."+tableName;
    //根据数据库名和表名查询数据库指定字段为null的字段
    List<Map<String,Object>> columnNameValues = ylCodeBaseService.findColumnNameValue(schemaTable);
    return columnNameValues;
}

Mapper层和service层,我只放一个因为都一样   

List<Map<String,Object>> findColumnNameValue(String schemaTable);

serviceImpl

    @Override
    public List<Map<String,Object>> findColumnNameValue(String schemaTable) {
        return baseMapper.findColumnNameValue(schemaTable);
    }
    

mapper.xml文件的SQL语句:

<select id="findColumnNameValue" resultType="java.util.Map">
    select * from ${schemaTable}
</select>

到此,这就完成了,但是有个bug,就是MyBatis查询出来字段值为null的字段,都不会返回给前端(使用MyBatis-plus的bug,不知道MyBatis有没有),这可就不行了,需要更改MyBatis-plus配置,因为我是使用Springboot所以需要在yml文件更改就行了

mybatis-plus:
	configuration:
		call-setters-on-nulls: true

至此,问题解决

<think> 我们正在处理一个ABAP程序问题,用户遇到了一个错误:字段 'GET_DATA_REF' 未知,既在指定中也未通过 'DATA' 声明。根据提供的引用,特别是引用[2],我们看到一个使用`cl_salv_bs_runtime_info=>get_data_ref`的示例。这明`get_data_ref`是类`cl_salv_bs_runtime_info`的一个方法。 因此,错误的原因可能是用户没有正确引用该方法。在ABAP中,调用类方法需要使用`=>`操作符,确保类已经定义。此外,需要检查是否包含了必要的类型组或者类定义。 根据引用[2]中的代码片段: ```abap cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lt_data ). ``` 正确的调用方式应该是使用类名`cl_salv_bs_runtime_info`后接`=>get_data_ref`。 如果用户直接写`GET_DATA_REF`而没有类名前缀,则编译器会认为它是一个变量或字段,从而报错。 解决方案: 1. 确保在调用方法时使用完整的类方法调用语法:`cl_salv_bs_runtime_info=>get_data_ref(...)`。 2. 确保程序中已经声明了所需的变量(如示例中的`lt_data`)。 3. 检查是否包含了必要的ABAP字典对象或类型定义。通常,`cl_salv_bs_runtime_info`是SAP标准类,需要额外声明,但需要确保系统中有该类。 如果用户仍然遇到问题,可以检查类`cl_salv_bs_runtime_info`是否可用。可以通过SE24(类构建器)查看该类是否存在。 另外,根据引用[1]和引用[2],使用`cl_salv_bs_runtime_info`时需要注意初始化以及获取数据的步骤,确保在调用`get_data_ref`之前已经正确设置了运行时信息。 总结步骤: - 在调用`get_data_ref`之前,通常需要先调用`set`方法设置运行时信息(如引用[2]中在之前有设置内存的操作)。 - 然后调用`get_data_ref`获取数据引用。 因此,用户需要检查代码中是否按照正确的顺序调用了类`cl_salv_bs_runtime_info`的相关方法。 如果用户没有声明变量`lt_data`,则需要在调用之前声明。引用[2]中使用了内`lt_data`,所以用户需要根据实际数据结构声明一个。 示例代码片段(参考引用[2]): ```abap DATA: lt_data TYPE REF TO data. "或者具体类型,但这里使用引用类型 " 通常,我们使用内引用来接收 DATA: lt_data_ref TYPE REF TO data. FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. " 调用方法获取数据引用 cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lt_data_ref ). " 将数据引用分配给字段符号以便操作 IF lt_data_ref IS NOT INITIAL. ASSIGN lt_data_ref->* TO <lt_data>. ENDIF. ``` 注意:这里使用了字段符号(FIELD-SYMBOLS)来解引用,因为`get_data_ref`返回的是一个数据引用(REF TO data),需要解引用后才能使用。 如果用户需要字段符号,也可以直接声明一个具体的内类型(如果知道结构的话): ```abap " 假设内结构为 SALV_T_DATA DATA: lt_data TYPE STANDARD TABLE OF SALV_T_DATA. " 但是,get_data_ref返回的是通用引用,所以通常我们知道具体类型,因此使用引用和字段符号更通用。 ``` 因此,用户错误的原因可能是: - 直接写了`GET_DATA_REF`而没有类名前缀,应改为`cl_salv_bs_runtime_info=>get_data_ref`。 - 没有正确声明接收的变量。 请用户检查代码按照上述建议修改。 </think>### 解决字段 'GET_DATA_REF' 未知的问题分析 根据引用[2]的代码示例,`GET_DATA_REF` 是类 `CL_SALV_BS_RUNTIME_INFO` 的实例方法。当系统提示 "字段 'GET_DATA_REF' 未知" 时,通常由以下原因导致: **根本原因分析**: 1. **类引用缺失**:未通过类名限定方法调用(缺少 `CL_SALV_BS_RUNTIME_INFO=>` 前缀) 2. **作用域问题**:方法在 `PUBLIC SECTION` 未声明或声明正确 3. **语法错误**:方法调用使用了 `.` 代替 `=>`(正确格式:`类名=>方法名()`) 4. **环境配置问题**:缺少必要的类型组或接口引用 ### 解决方案步骤 #### 步骤 1:正确调用类方法 ```abap " 错误写法 GET_DATA_REF( IMPORTING r_data = lt_data ). " 正确写法(添加类名前缀) cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lt_data ). ``` #### 步骤 2:声明接收变量 确保接收数据的变量已正确定义: ```abap DATA: lt_data TYPE REF TO data. " 通用数据引用 " 或指定具体类型(若已知结构) DATA: lt_data TYPE STANDARD TABLE OF your_structure. ``` #### 步骤 3:检查前置初始化 根据引用[1][2],调用 `GET_DATA_REF` 前必须初始化运行时信息: ```abap " 初始化ALV运行时环境 cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false metadata = abap_false data = abap_true ). " 执行ALV显示(此处触发数据收集) CALL METHOD alv_grid->display. " 再获取数据 cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lt_data ). ``` #### 步骤 4:验证类型声明 检查程序头部是否包含必要声明: ```abap " 确保包含标准类声明 CLASS cl_salv_bs_runtime_info DEFINITION LOAD. ``` #### 步骤 5:处理字段长度兼容性 如引用[2][4]所示,需确保字段长度兼容: ```abap " 调整字段输出长度(参考引用[2]) LOOP AT lt_component ASSIGNING FIELD-SYMBOL(<fs_comp>). <fs_comp>-s_elem-outputlen = <计算后的长度>. ENDLOOP. ``` ### 注意事项 1. **执行顺序**:必须在 `CL_SALV_BS_RUNTIME_INFO=>SET()` 之后调用 `DISPLAY()` 才能获取数据[^1][^2] 2. **内存清理**:使用后需清除运行时信息 ```abap cl_salv_bs_runtime_info=>clear_all( ). ``` 3. **类型检查**:若接收变量类型错误,需使用 `ASSIGN` 转换: ```abap FIELD-SYMBOLS <lt_table> TYPE ANY TABLE. ASSIGN lt_data->* TO <lt_table>. ``` ### 完整示例 ```abap DATA: lo_alv TYPE REF TO cl_salv_table, lt_data TYPE REF TO data. " 初始化运行时设置 cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ). " 显示ALV(触发数据收集) CALL METHOD lo_alv->display. " 获取数据 cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lt_data ). " 清理运行时环境 cl_salv_bs_runtime_info=>clear_all( ). ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值