news 2026/2/19 10:07:18

3. 关键要点:添加`id`后建议给原有联合字段加唯一索引,确保业务数据不重复;实体类需同步添加`id`字段并标记`@TableId`注解。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3. 关键要点:添加`id`后建议给原有联合字段加唯一索引,确保业务数据不重复;实体类需同步添加`id`字段并标记`@TableId`注解。
数据库查询失败,nested exception is org.apache.ibatis.exceptions.PersistenceException:### Error querying database. Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: SELECT survey_year,division_code,natural_village,province,city,county,county_code,town,town_code,village_community ,id FROM ln_kashin_beck_main ORDER BY ### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: SELECT survey_year,division_code,natural_village,province,city,county,county_code,town,town_code,village_community ,id FROM ln_kashin_beck_main ORDER BY添加主键,id varchar(255)

你希望通过ln_kashin_beck_main表添加id字段作为主键来解决这个查询异常,核心是让MyBatis-Plus能找到对应的id主键列,同时解决ORDER BY空字段的问题,这样生成的SQL就会合法可执行。

下面我帮你完成表结构修改(添加id字段)、更新建表语句,同时补充对应的查询代码修正,彻底解决这个问题。

一、核心修改思路

  1. ln_kashin_beck_main表添加id字段,设为VARCHAR(255)类型、非空、主键(也可设为自增,更贴合MyBatis-Plus默认习惯)。
  2. 保留原有联合字段(survey_yeardivision_codenatural_village),确保业务逻辑不变,仅新增id作为MyBatis-Plus识别的主键。
  3. 修正SQL中的ORDER BY,补充排序字段(优先用新增的id,或原有业务字段)。

二、方案1:直接修改现有表(已创建表,保留数据)

如果表已经在数据库中存在(有数据),用ALTER TABLE语句添加id字段,无需重建表,不丢失现有数据。

-- 给现有表添加id字段,设为VARCHAR(255)、非空、主键-- 若需要手动赋值id,执行此语句(后续插入数据需手动指定id值)ALTERTABLE`ln_kashin_beck_main`ADDCOLUMN`id`VARCHAR(255)NOTNULLFIRSTCOMMENT'主键ID,适配MyBatis-Plus查询',ADDPRIMARYKEY(`id`);-- (可选优化)若想让id自增(更方便,无需手动赋值),建议改为INT类型自增(推荐)-- 先删除上面的语句,执行此语句(更贴合MyBatis-Plus默认主键习惯)ALTERTABLE`ln_kashin_beck_main`ADDCOLUMN`id`INTNOTNULLAUTO_INCREMENTFIRSTCOMMENT'主键ID,自增,适配MyBatis-Plus查询',ADDPRIMARYKEY(`id`);-- 补充:原有联合字段建议添加唯一索引,确保业务唯一性(避免重复数据)ALTERTABLE`ln_kashin_beck_main`ADDUNIQUEINDEX`idx_unique_main`(`survey_year`,`division_code`,`natural_village`)COMMENT'联合唯一索引,确保同村同年份数据不重复';
  • 说明:FIRST表示id字段排在表的第一列,不影响其他字段顺序;添加唯一索引是为了替代原有联合主键的业务唯一性约束。

三、方案2:新建带id字段的表(全新表,无历史数据)

如果是新建表,直接使用下面的建表语句,包含id字段,适配MyBatis-Plus查询。

CREATETABLE`ln_kashin_beck_main`(-- 新增id字段,VARCHAR(255),非空,主键(适配MyBatis-Plus)`id`VARCHAR(255)NOTNULLCOMMENT'主键ID,适配MyBatis-Plus查询',-- 原有核心关联字段(保留业务逻辑)`survey_year`VARCHAR(255)NOTNULLCOMMENT'调查年份(信息铺入,不需要输入,只可选择)',`division_code`VARCHAR(255)NOTNULLCOMMENT'行政区划代码(选择行政村后自动填充,无需录入,已铺入所有行政村代码)',`natural_village`VARCHAR(255)NOTNULLCOMMENT'自然村(屯)(已铺入全部自然村名称,可选择也可手动输入)',-- 原有基础行政区划附加字段`province`VARCHAR(255)NOTNULLCOMMENT'省(信息铺入,不需要输入,只可选择)',`city`VARCHAR(255)NOTNULLCOMMENT'市(信息铺入,不需要输入,只可选择)',`county`VARCHAR(255)NOTNULLCOMMENT'县(信息铺入,不需要输入,只可选择)',`county_code`VARCHAR(255)NOTNULLCOMMENT'县代码(选择县区后自动填充,无需录入,已铺入所有县区代码)',`town`VARCHAR(255)NOTNULLCOMMENT'乡(镇)(信息铺入,不需要输入,只可选择)',`town_code`VARCHAR(255)NOTNULLCOMMENT'乡(镇)代码(选择乡镇后自动填充,无需录入,已铺入所有乡镇代码)',`village_community`VARCHAR(255)NOTNULLCOMMENT'行政村/社区(信息铺入,不需要输入,只可选择)',-- 主键约束(id作为主键),新增联合唯一索引确保业务唯一性PRIMARYKEY(`id`)COMMENT'主键:id,适配MyBatis-Plus查询',UNIQUEINDEX`idx_unique_main`(`survey_year`,`division_code`,`natural_village`)COMMENT'联合唯一索引:确保同调查年份+行政区划+自然村记录不重复')ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 ROW_FORMAT=DYNAMICCOMMENT='大骨节病防治信息主表(基础行政区划信息)';

四、修正MyBatis-Plus实体类(适配id字段)

更新实体类,添加id字段,标记为MyBatis-Plus主键,确保查询时能正确映射。

importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importlombok.Data;@Data@TableName("ln_kashin_beck_main")// 对应数据库表名publicclassLnKashinBeckMain{// 新增id字段,标记为MyBatis-Plus主键@TableId(value="id")// 对应数据库表的id字段privateStringid;// 若id是INT自增,改为private Integer id;// 原有业务字段(保留不变)privateStringsurveyYear;privateStringdivisionCode;privateStringnaturalVillage;privateStringprovince;privateStringcity;privateStringcounty;privateStringcountyCode;privateStringtown;privateStringtownCode;privateStringvillageCommunity;}

五、修正查询代码(解决ORDER BY空字段问题)

添加id字段后,还需补充ORDER BY的排序字段,避免生成空排序语句,下面给出合法的查询示例。

示例1:基础查询(按id排序)

importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importorg.springframework.stereotype.Service;importjavax.annotation.Resource;importjava.util.List;@ServicepublicclassLnKashinBeckMainService{@ResourceprivateLnKashinBeckMainMapperlnKashinBeckMainMapper;// 合法查询:按id升序排序,避免ORDER BY空字段publicList<LnKashinBeckMain>listAll(){LambdaQueryWrapper<LnKashinBeckMain>queryWrapper=newLambdaQueryWrapper<>();// 补充排序字段(id),解决ORDER BY空字段问题queryWrapper.orderByAsc(LnKashinBeckMain::getId);returnlnKashinBeckMainMapper.selectList(queryWrapper);}}

示例2:手动编写SQL(避免MyBatis-Plus自动生成错误SQL)

若仍有问题,可直接在XML映射文件中编写合法SQL,明确查询字段和排序字段。

<selectid="listAll"resultType="com.example.entity.LnKashinBeckMain">SELECT id, survey_year, division_code, natural_village, province, city, county, county_code, town, town_code, village_community FROM ln_kashin_beck_main ORDER BY id ASC;<!-- 补充排序字段id,合法有效 --></select>

六、验证问题是否解决

  1. 执行表修改语句(或新建表语句),确认ln_kashin_beck_main表中存在id字段且为主键。
  2. 重启项目,确保实体类修改生效。
  3. 调用查询方法,观察是否能正常返回数据,无异常抛出。
  4. (可选)查看MyBatis-Plus生成的SQL日志,确认SQL为合法语句(如SELECT id,survey_year,... FROM ln_kashin_beck_main ORDER BY id ASC)。

总结

  1. 本次解决问题的核心是给表添加id字段作为主键,适配MyBatis-Plus的默认主键查询规则,解决「查询不存在id列」的问题。
  2. 同时补充ORDER BY的具体排序字段(优先id),解决「空排序语句」的语法错误。
  3. 关键要点:添加id后建议给原有联合字段加唯一索引,确保业务数据不重复;实体类需同步添加id字段并标记@TableId注解。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/18 20:13:20

3 款宝藏小软件,工作效率直接起飞!

打工人的日常&#xff0c;不是在跟繁琐的文件打交道&#xff0c;就是在处理各种复杂任务的路上。今天给大家带来几款超实用电脑小软件&#xff0c;巧妙运用&#xff0c;操作电脑的效率直接火箭式飙升&#xff0c;让工作轻松不费力&#xff01; Quicklook 快速预览神器 Quick…

作者头像 李华
网站建设 2026/2/10 20:08:29

Android开发工程师职位深度解析与面试指南

神通科技集团股份有限公司 安卓开发工程师(消费电子) 职位信息 1. 主导和参与项目开发的软件需求分析、架构评估设计、详细设计、代码开发和性能优化,以及技术文档的编写等工作,保证软件开发进度和质量满足项目要求; 2. 完成软件模块的需求整理和软件设计,验证及修正测试…

作者头像 李华
网站建设 2026/2/17 4:15:50

fastapi异步处理模板

from fastapi import FastAPIfrom pydantic import BaseModel# 1. 初始化 FastAPI 应用实例app FastAPI(title"字符串处理接口", # 接口文档标题description"接收单个字符串&#xff0c;返回处理后的字符串", # 接口文档描述version"1.0.0" …

作者头像 李华