2013-10-08 3 views
0

В моем приложении, когда User удаляет Message, мне нужно удалить взаимосвязь между двумя объектами, сохраняя их неповрежденными. Таким образом, я попытался удалить строки непосредственно из таблицы отношений, используя следующие способы:Исходный запрос создает ошибку синтаксиса MySQL и неожиданный результат

1.

Query q = em.createNativeQuery("DELETE FROM User_Inbox WHERE User_USERNAME = :username AND Message_ID = :messageID"); 
q.setParameter("username", username); 
q.setParameter("messageID", messageID); 
q.executeUpdate(); 

2.

Query q = em.createNativeQuery("DELETE FROM User_Inbox WHERE User_USERNAME = :username AND Message_ID = :messageID"); 
q.setParameter("username", "'" + username + "'"); 
q.setParameter("messageID", "'" + messageID + "'"); 
q.executeUpdate(); 

1-й и 2-й подходы произвели следующее исключение:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near ':username AND 
Message_ID = :messageID' at line 1 
Error Code: 1064 

3.

Query q = em.createNativeQuery("DELETE FROM User_Inbox WHERE User_USERNAME = ':username' AND Message_ID = ':messageID'"); 
q.setParameter("username", username); 
q.setParameter("messageID", messageID); 
q.executeUpdate(); 

3-й подход не производит каких-либо исключений. Это нормально. Однако ничего не было удалено из таблицы User_Inbox.

4.

Query q = em.createNativeQuery("DELETE FROM User_Inbox WHERE User_USERNAME = '" + username + "' AND Message_ID = '" + messageID + "'"); 
q.executeUpdate(); 

4-й подход работал отлично. Запрос прошел гладко, и запись была удалена должным образом.

Последний подход сработал, но код не выглядит очень аккуратным для меня. Я был бы очень благодарен, если бы кто-нибудь мог показать мне, что я сделал не так с 1-м тремя подходами.

UPDATE:

Основываясь на answer от Д. Мур, я только что узнал, что названные параметры не могут быть использованы с носителями запросов. Это было упомянуто в этом answer Паскалем Тивентом.

Именованные параметры соответствуют правилам для идентификаторов, определенных в Разделе 4.4.1. Использование именованных параметров применяется к языку запросов Java Persistence и не определяется для собственных запросов. Только привязка позиционных параметров может быть портативно использована для собственных запросов .

+0

В запросах используются таблицы и столбцы из схемы, как они отображаются на объекты Java? –

+0

@nikpon: Есть два объекта, называемых 'User' и' Message' с отношениями '@ ManyToMany' между ними. Однако я ничего не удаляю из таблиц этих двух сущностей. Мне нужно удалить записи из '@ JoinTable', созданные отношениями' @ ManyToMany'. –

+0

Объекты удаляют то, что простой случай вы можете обнаружить в одной таблице соединений, содержит только ссылки, которые вы удаляете с помощью собственных запросов, а не из диспетчера сущностей. –

ответ

1

Я согласен с тем, что (4.), безусловно, не является правильным способом заниматься вещами. Это утомительно и небезопасно.

(3) работают, но не дают ожидаемых результатов, поскольку у них есть дополнительные кавычки.

Что касается того, почему (1.) не работает, вы бы хотели посмотреть в SQL, который создается (я считаю, что настройки специфичны для используемой системы JPA). Кажется, что код правильный, но ошибка означает, что параметры не подменяются.

У позиционных параметров есть что-то другое?

Query q = em.createNativeQuery("DELETE FROM User_Inbox WHERE User_USERNAME = ?1 AND Message_ID = ?2"); 
q.setParameter(1, username); 
q.setParameter(2, messageID); 
q.executeUpdate(); 
+0

Это какие параметры используются? Почему бы не использовать именованные параметры в JPA? –

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