达梦数据库报无效的表或视图名或无效的列名等错误

最新的解决错误的解法:

我的达梦数据库一值包大小错误问题,其实最根本的原因还是当初创建数据库的时候,没有把那个忽视大小写的配置打开,导致我的sql语句必须要带上双引号才能正确的访问,不然就会被自动转换成大写,然后就会报无效的列名等,之前的那些都是不治本的策略,最好的解决是在创建数据库的时候,把下列操作取消勾选

———————————————————————————————————————————

[Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: ### Error querying database. Cause: dm.jdbc.driver.DMException: 第3 行附近出现错误: 无效的表或视图名[t_user] ### The error may exist in com/example/springboot/mapper/UserMapper.java (best guess) ### The error may involve com.example.springboot.mapper.UserMapper.selectOne ### The error occurred while executing a query ### SQL: SELECT id,username,password,nick_name,age,sex,role FROM "t_user" WHERE (username = ? AND password = ?) ### Cause: dm.jdbc.driver.DMException: 第3 行附近出现错误: 无效的表或视图名[t_user] ; 第3 行附近出现错误:

这是第一个报错,包无效表名,错误的原因是因为,我配置文件数据库的连接是:

spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://localhost:5236/springboot_vue
    username: SYSDBA
    password: ********
    hikari:
      # 连接池最小空闲连接数
      minimum-idle: 5
      # 连接池最大连接数
      maximum-pool-size: 20
      # 空闲连接存活时间(毫秒)
      idle-timeout: 300000
      # 连接池名字(可选)
      pool-name: HikariCP
      # 从连接池获取连接的超时时间(毫秒)
      connection-timeout: 60000
      # 检测连接是否有效的 SQL(达梦要用 FROM DUAL)
      connection-test-query: SELECT 1 FROM DUAL

但是我的模式的结构是


这里因为使用的是SYSDBA用户连接的,所以他会默认去SYSDBA下查找表,但我SYSDBA本身没有表,所以找不到,就报了这个错误,解决的办法就是,在和数据库映射的对象中添加:

//数据库表名
@TableName("\"springboot_vue\".\"t_user\"")
@Data
public class User

注意:如果你的数据库建的表名是小写的(或者建表时,表名是用双引号的),则格式必须是"\"springboot-vue\".\"t_user\"" ,因为如果不加上双引号,在查询数据库的时候,会自动变成大写,同样也会找不到表,提示无效的表或视图名。

但是上面这种方法太麻烦且繁琐了,最根本的解决方案是,直接连接在配置文件配置

spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    # 推荐用 ?schema=... 参数(注意大写或小写均可,但以你驱动文档为准)
    url: jdbc:dm://127.0.0.1:5236?schema=springboot_vue
    username: SYSDBA
    password: ************
    hikari:
      connection-init-sql: SET SCHEMA springboot_vue
      connection-test-query: SELECT 1 FROM DUAL
      minimum-idle: 5
      maximum-pool-size: 20

第二个错误是无效的列名:

2025-08-12 11:53:31.077 ERROR 27064 --- [nio-9090-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: 
### Error querying database.  Cause: dm.jdbc.driver.DMException: 第3 行附近出现错误:
无效的列名[USERNAME]
### The error may exist in com/example/springboot/mapper/UserMapper.java (best guess)
### The error may involve com.example.springboot.mapper.UserMapper.selectOne
### The error occurred while executing a query
### SQL: SELECT  "id",username,"password","nick_name","age","sex","role"  FROM "springboot-vue"."t_user"     WHERE (username = ? AND "password" = ?)
### Cause: dm.jdbc.driver.DMException: 第3 行附近出现错误:
无效的列名[USERNAME]
; 第3 行附近出现错误:
无效的列名[USERNAME]; nested exception is dm.jdbc.driver.DMException: 第3 行附近出现错误:
无效的列名[USERNAME]] with root cause

 

错误的原因还是因为没有加双引号,达梦数据库会自动大写去查找,不同的点就是@TableId设置了自增长的话,就无需再用@TableField,只需要在@TableId设置别名即可
 

//数据库表名
@TableName("\"springboot-vue\".\"t_user\"")
@Data
public class User
{
//    设置ID自增长
    @TableId(value = "\"id\"",type = IdType.AUTO)
    private Integer id;

    @TableField("\"username\"")
    private String username;

    @TableField("\"password\"")
    private String password;

    @TableField("\"nick_name\"")
    private String nickName;

    @TableField("\"age\"")
    private Integer age;

    @TableField("\"sex\"")
    private String sex;

    @TableField("\"role\"")
    private Integer role;

    //告诉mybaties bookList是不存在的
    @TableField(exist = false)
    private List<Book> bookList;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值