Loading

动态查询表数据实现方式,mybatis+数据库函数

postgrep数据库新建函数

create function get_id_by_field(p_table_name text, p_field_value text) returns text
    security definer
    language plpgsql
as
$$
DECLARE
    v_field_name TEXT;
    v_id TEXT;
    v_sql TEXT;
    v_id_field TEXT := 'id'; -- 默认ID字段名
BEGIN

    -- 根据表名赋值不同的字段名
    IF p_table_name = 'A' THEN
        v_field_name := 'F1';
    ELSEIF p_table_name = 'B' THEN
        v_field_name := 'F2';
    ELSE
        v_field_name := 'F3';
    END IF;

    -- 动态构建SQL(使用参数化查询防止SQL注入)
    v_sql := format('SELECT %I FROM %I WHERE %I = $1 LIMIT 1',
                    v_id_field, p_table_name, v_field_name);

    -- 执行查询
    EXECUTE v_sql INTO v_id USING p_field_value;
    RETURN v_id;
EXCEPTION
    WHEN others THEN
        RAISE NOTICE 'Error searching % in %.%: %',
            p_field_value, p_table_name, v_field_name, SQLERRM;
        RETURN NULL;
END;
$$;

alter function get_id_by_field(text, text) owner to test;

在mybatis-plus的某个mapperxml中加入方法

    <select id="getIdByTableAndField" parameterType="com.entity.DTO.erp.ERPUpdateInfo" resultType="java.lang.String">
        select get_id_by_field(#{tableName},
                               #{voucherNumber});
    </select>

mapper接口

 String getIdByTableAndField(ERPUpdateInfo dto);

 

使用

var id = prcReimbursementMapper.getIdByTableAndField(info);

 

posted @ 2025-07-25 13:11  Jicing  阅读(13)  评论(0)    收藏  举报