在hibernate createSQLQuery中转义冒号

时间:2011-01-17 10:32:37

标签: hibernate postgresql escaping

我对如何创建包含冒号的SQL语句感到困惑。我正在尝试创建一个视图,我正在使用(注意双冒号):

create view MyView as (
  SELECT 
    tableA.colA as colA,
    tableB.colB as colB, 
    round(tableB.colD / 1024)::numeric, 2) as calcValue,
  FROM 
    tableA, tableB
  WHERE
    tableA.colC = 'someValue'
);

这是一个postgres查询,我被迫使用双冒号(::)来正确运行该语句。

然后我通过以下声明:

s.createSQLQuery(myQuery).executeUpdate();

我得到了一个:

Exception in thread "main" org.hibernate.exception.DataException: \
    could not execute native bulk manipulation query
 at org.hibernate.exception.SQLStateConverter.convert(\
    SQLStateConverter.java:102)
    ... more stacktrace...

将上述语句的输出更改为(注意问号):

create view MyView as (
  SELECT 
    tableA.colA as colA,
    tableB.colB as colB, 
    round(tableB.colD / 1024)?, 2) as calcValue,
  FROM 
    tableA, tableB
  WHERE
    tableA.colC = 'someValue'
);

显然,hibernate会将我的冒号与命名参数混淆。

有没有办法逃避冒号(一个谷歌建议,提到单个冒号被转义为双冒号不起作用)或另一种方式运行此声明?

感谢。

2 个答案:

答案 0 :(得分:4)

executeUpdate()方法不是针对CREATE VIEW的DDL语句,而是针对DML语句UPDATE

您应该获取一个普通的JDBC连接,可以来自Session s.connection()并运行您的SQL语句。

Connection connection = s.connection();
Statment statment = connection .createStatement();
try {
statment .execute("CREATE VIEW ...");
} finally {
 statment .close();
}

答案 1 :(得分:0)