hibernate createSqlQuery - 在日期转义分号

时间:2014-10-20 08:21:01

标签: java hibernate escaping

我已尝试运行以下插入本机查询。

queryInsert = "INSERT INTO abc(id,date1, date2) VALUES(5,\"2014-10-20 14:31:01\",\"2014-10-20 14:31:11\");";
SQLQuery sqlQuery = session.createSQLQuery(queryInsert);
sqlQuery.executeUpdate();

我得到以下例外:

org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
    ....
    at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45]
Caused by: java.sql.SQLException: No value specified for parameter 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2487) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2462) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2311) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2262) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2246) ~[mysql-connector-java-5.1.31.jar:na]
    at com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:205) ~[bonecp-0.8.0.RELEASE.jar:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
    ... 29 common frames omitted

事情是hibernate将我的日期字符串中的冒号(:)视为查询参数。我该怎么做才能将它视为查询参数?我尝试使用\:,和::转义,但没有效果。

非常感谢!

更新:

感谢您的回复,遗憾的是,我无法对我的案例进行参数化查询。它实际上更像是带有INSERT INTO语句的转储文件,因此拆分它们并创建参数化查询只会增加开销,所以我只想运行这些INSERT INTO查询语句。

3 个答案:

答案 0 :(得分:1)

我刚从postgres数据库导出了一些数据(要求它创建insert语句)

转储看起来像

INSERT INTO scenario_collection (id, date_collected, file_name, scenarioid) VALUES (137, '2014-10-16 14:47:00', '20141016134500-eland.log', 11);

所以尝试使用单引号

答案 1 :(得分:0)

您可以通过参数设置值,因此该值不会被解释为控制代码!你可以找到一个很好的解释here

String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setParameter("stockCode", "7277")
.list();

答案 2 :(得分:-1)

我想知道你的date1& date2是字符串?如果没有,请改为提供日期参数。