最近在写项目时,遇到了两个问题

1、在项目中引入数据库之后,要使用数据库中的某一张表时会报一个错误:Unable to resolve table '表名' ;即无法找到此表。出现这个问题通常有以下三种情况:

(1)表名拼写错误:有可能是表名在输入的时候按错了或者大小写不对(一般都区分大小写)。

(2)数据库连接问题:可能未连上数据库或者连错了数据库。

(3)表不存在:可能实际上没有在所连接的数据库中创建此表。

通过排查我发现第一和第三中情况可以排除,我是严格按照大小写区分表名且在数据库中有这张表的。就只有可能是第二种情况。

于是我通过删表,再重新创建,重新连接,如此反复,最后发现还是报此错误。

我又在此数据库的基础上换了一个表连接,发现还是报同样的错误,即 Unable to resolve table '表名' 。在网上查询了一下,有人说是没设置sql方言(SQL Dialects)导致的,于是我在SQL Dialects中将全局sql方言和项目sql方言全部配置成MySQL(即我使用的sql),但是发现没有用。

后来通过网上查询发现这有可能是数据库模式(schema)问题:数据库使用了特定的模式来组织表,而在查询时没有指定正确的模式,也会导致找不到表。

于是我又在sql解析范围(SQL Resolution Scopes)中指定其项目映射(Project Mapping),将其指定为我导入的sql表就解决了。

总结就是:当数据库中存在多个sql总表时,idea中的DataGrip识别时它是不会,也不能透过总表去找下面的分表的,我们需要指定它在哪一个总表当中它才能找到对应的分表。

2、在使用注解向数据库插入数据时遇到: '#{' unexpected ; 即:在当前的语法环境中,#{} 的使用不符合预期的规则。错误代码为:
@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user)" +            "values #{name},#{username}#{password},#{phone}#{sex},#{idNumber}#{createTime},#{updateTime}#{createUser},#{updateUser}")
void insert(Employee employee);
我百思不得其解,从代码上看没有发现明显错误,后来仔细看才发现,在写#{},#{}时我只写了两个,后面的就复制粘贴的前面的,导致出现有些占位符之间没有逗号分隔。在改进且确保 Employee 类中的属性与 #{} 中的名称完全匹配,并且在实际调用 insert 方法时为这些属性正确赋值了之后发现还是报错。
在经过对代码的分析研究之后我发现,我所用的是values而不是value,之所以这样是因为:

当进行插入操作时,我们使用 values 来明确给出要插入到表中的具体数据。使用 values 而不是 value 是因为在插入多行数据或者一次性插入多个值时,是多个值的集合,所以要用复数形式 values。
而当我们平时使用value时,后面的数据只有一个,以至于不用加()把数据括起来,进而当我们使用values时也会习惯性的不加()从而导致报错。改进后应该是:
#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser} 这个位置应该整体用小括号括起来,它才是一个整体,因为我们前面写了values的,如果不括起来,idea就只能识别第一个,即#{name},以至于后面的都会报错。
这在平时是一个很容易忽略的细节,同时在错误信息中也体现出来了: “( or ROW expected”
通常表示在当前的语法结构中,期望出现左括号 ( 或者 ROW 这样的特定语法元素,但实际没有。


 

0.0分

0 人评分

  评论区

  • «
  • »