2011-01-17 2 views
2

Я смущен тем, как я могу создать инструкцию SQL, содержащую двоеточия. Я пытаюсь создать представление, и я использую (обратите внимание на двойные двоеточия):Escapeing colons in hibernate createSQLQuery

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' 
); 

Очевидно, что спящий режим смущает мои двоеточия с именованными параметрами.

Есть ли способ избежать двоеточия (предложение google, в котором упоминается, что один двоеточие скрывается, поскольку двойной двоеточие НЕ работает) или другой способ запуска этого утверждения?

Спасибо.

ответ

4

метод executeUpdate() не предназначен для DDL statments как CREATE VIEW но для операторов DML, как UPDATE

вместо него вы должны приобрести простую связь JDBC, может быть от Session с s.connection() и запустить SQL заявление.

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

Я думаю, что сделал. Но нет ли способа нормально разобрать двоеточия (если бы я был упрям ​​и хотел использовать начальный путь?) – stratosgear

+0

@Stratosgear Вы можете обойти его с помощью синтаксиса 'CAST' SQL-стандарта, например' CAST (round (tableB.colD/1024) AS числовой) ' –

Смежные вопросы