2015-07-23 4 views
0

Мы используем следующую инструкцию SQL и выполнить через createSQLQuery() - список() вместо executeUpdate()Hibernate createSQLQuery() - список() и executeUpdate() - удаление и оператор выбора

а) исключить из сотрудник, где НБР в ('1', '2', '3')
б) исключить из emp_details где empNbr = (выберите NBR от сотрудника, где имя = 'Somu')

Оба запросы отлично работает в SQL Клиент, но порождает следующее исключение

org.hibernate.exception.SQLStateConverter.handledNonSpecificException 
(SQLStateConverter.java:126), org.hibernate.exception.SQLStateConverter. 
convert(SQLStateConverter.java:114),org.hibernate.exception. 
JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66), 
org.hibernate.loader.Loader.doList(Loader.java:2235), 
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129), 
org.hibernate.loader.Loader.list(Loader.java:2124), 
org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312), 
org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1723), 
org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165), 
org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175) 

Нет проблемы с запросом, так как запрос отлично работает в SQL-клиенте.

Вопрос:

1) Можно ли передать или выполнить сценарий удаления с помощью createSQLQuery() - список() или нет?
2) Неправильно ли использовать createSQLQuery() - list() для сценария удаления?

ответ

2

Вы должны позвонить executeUpdate() вместо list по запросу, вы возвращаетесь с createSQLQuery(), если вы хотите выполнить инструкцию delete!

+0

Способ метода createSQLQuery (SQLStatement) .list() - list() не поддерживает инструкцию удаления ??? – Kathir

+1

Да ... вы должны использовать executeUpdate для операторов update и delete и списка для запросов. –

+0

Большое спасибо за подтверждение. – Kathir

2

Неправильная практика использования .list() для любого обновления или удаления скрипта.

Как уже упоминалось выше Андре, вам нужно использовать .executeUpdate, который имеет тип возврата int, возвращая количество строк, на которые влияет команда executeUpdate.

SQLQuery sqlQuery = session.createSQLQuery("delete from employee where nbr in (1,2,3)"); sqlQuery.executeUpdate();

Кроме того, его хорошая практика, чтобы использовать именованные параметры для передачи ваших параметров в запросе. (Прочитано this для справки)

+0

Большое спасибо за подтверждение – Kathir

+0

@ Сага Панда ... хороший намек ... я согласен, что нужно использовать параметры. Если вы выполняете Statement часто, это помогает оптимизации БД, поскольку позволяет скомпилированные операторы кэшироваться внутри СУБД. –