尝试执行一个创建表查询,其列名为"在里面。虽然创建的字符串查询在MYSQL浏览器上运行良好,但它似乎每次都会出错。
createStmt的Sysout给出:
Create table `myschema`.`flatTest_data_tbl`(`NAME` longtext,`TASK` longtext,`LO&"CATION` longtext) CHARACTER SET utf8
SQLQuery createQuery = session.createSQLQuery(createStmt);
createQuery.executeUpdate();
session.close();
它在executeUpdate上出错:
java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at org.hibernate.engine.jdbc.internal.BasicFormatterImpl$FormatProcess.perform(BasicFormatterImpl.java:142)
at org.hibernate.engine.jdbc.internal.BasicFormatterImpl.format(BasicFormatterImpl.java:91)
at org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement(SqlStatementLogger.java:101)
at org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement(SqlStatementLogger.java:95)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:180)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:91)
at org.hibernate.engine.query.spi.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:196)
at org.hibernate.internal.SessionImpl.executeNativeUpdate(SessionImpl.java:1313)
at org.hibernate.internal.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:401)
答案 0 :(得分:0)
我承认挑选名称有时会令人恐惧,特别是如果这些名称正由多个工具处理。例如,您选择的名称是某个DBMS中的关键字,但您的关系映射器并不关心。数据库引发的错误然后被映射器包装和遮盖,你需要几个小时来找出你做错了什么。
此外,考虑序列化字符串时的编码问题。特别是当通过Web发送非ASCII字符或从文件中读取数据时,您很可能会发现原始输入字符串看起来与最终从管道中弹出的输入字符串不同。
出于这些原因,你的做法非常疏忽。很高兴您的代码在开始时而不是在生产中正常运行。
但是,为了找到解决方案,那么:
创建第二个包含以下列的表
s_label:VARCHAR(1024),
t_value:LONGTEXT
并从原始表中向此表添加外键。文件中的列名将进入s_label,您可以随意填充任何您喜欢的字符。
这可能是表连接的一小部分开销,但更重要的是:它很干净:)