NutzCN Logo
精华 关于字段名刚好和关键字相同的情况
发布于 2967天前 作者 qq_6cf7c16a 3887 次浏览 复制 上一个帖子 下一个帖子
标签:

下面的SQL在MYSQL中出现语法错误:
INSERT INTO ZT_BIZOBJECTFIELD(FID,BIZID,COLUMNNAME,DISPLAYNAME,FDESC,DATATYPE,DATALENGTH,PRECISION,HASINITVALUE,INITVALUE,INITVALUESOURCE,INITDICTID,USEDICTCODE,ALLOWSORT,ALLOWSEARCH,WITHFULLTEXT,ISPK,ISUNIQUE,ALLOWNULL,SORTORDER) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

原因是PRECISION这个字段名刚好和MYSQL中的关键字重名。现这样情况一般是在字段上加上PRECISION。现在NUTZ是怎么处理的?
改字段名当然可以,但是如果这个表是已经存在的,并且在用,就不可能改了。
如果在POJO是加上PRECISION,当然也可以,但是我现在在做产品,如果换成ORACLE就会出错。
所以希望NUTZ能够提出一个解决方案,来解决这个问题。

18 回复

解决方法有很多种,我举两个例子:

  • 继承AnnotationEntityMaker并修改make方法, 里面
  • 通过修改Entity实例
if (dao.meta.isMysql()) {
    NutMappingField mf = (NutMappingField)dao.getEntity(BizXXXXX.class).getField("precision");
	mf.setColumnName("'"+mf.getColumnName()+"'");
}

  1. 继承AnnotationEntityMaker并修改make方法
  2. 通过修改Entity实例,见下面的代码.
if (dao.meta.isMysql()) {
    NutMappingField mf = (NutMappingField)dao.getEntity(BizXXXXX.class).getField("precision");
	mf.setColumnName("'"+mf.getColumnName()+"'");
}

不能在这个类里面改,我试了一下,这样改太彻底了,相当于吧字段名改成了"'"+mf.getColumnName()+"'",这是不对的。应该在生成SQL语句的地方改才合适。

我是在AnnotationEntityMaker._evalMappingField加上了下面的代码:
if (expert.getDatabaseType().equalsIgnoreCase(DB.ORACLE.name())) {
ef.setColumnName(""" + columnName + """);
} else if (expert.getDatabaseType().equalsIgnoreCase(DB.MYSQL.name())) {
ef.setColumnName("" + columnName + "");
} else {
ef.setColumnName(columnName);
}
来实现的。这样不行。

请提供新的解决方案,在线等。

@qq_6cf7c16a 不行,那起码告诉一下哪里不行,报什么错吧?

另外,只需要对特定的字段做修改,而非全部加。 再另外,不是只有mysql冲突了吗?那还判断oracle干啥

不报任何错,原因是你把字段改成了‘precision’,做查询是语句变成了select 'precision' from table1,这语句是对了,执行没有问题。但是NUTZ取查询结果时,变成了rs.getString("'precision'"),这样是取不到值的。所以NUTZ的取到的结果集为空。

这样看来,这个问题就没有简单方案了

public String org.nutz.dao.impl.entity.field.NutMappingField.getColumnName(){}

查找该方法的引用,有56个, 逐一排查,看看哪些调用需要加上引号

我现在目前可以改一下NUTZ的代码,不过我希望你们的下一个版本中能够考虑一下这个问题

@qq_6cf7c16a 考虑中,改动有点大

修改步骤:

  • 在Daos类中新增Keyworks内部类, 内含各种数据库的关键字集合
  • 为NutMappingField添加 getColumnNameInSql方法, 用于得到适合插入到SQL语句中的字符串
  • 反向查找所有引用了MappingField.getColumnName的代码, 逐一审查是否需要改成调用getColumnNameInSql方法
  • 添加相关的testcase

拼接sql的时候加 ,查询填充结果的时候不能用加匹配

拼接sql的时候加 `` ,查询填充结果的时候不能用加``匹配

真心感谢。有这样给力的技术支持。我可以放心的在公司项目中推荐用NUTZ了。

必须的,开源的好处就是可以随便玩,

有没有具体的实现代码,我继承了AnnotationEntityMaker并实现了make方法但并没有生效还是走的AnnotationEntityMaker中的make方法

添加回复
请先登陆
回到顶部