在我的应用程序中,当User
删除Message
时,我需要删除两个实体之间的关系,同时保持它们完整。因此,我尝试使用以下方式直接从关系表中删除行:
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();
第一种和第二种方法产生了以下异常:
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();
第三种方法没有产生任何异常。一切顺利。但是,User_Inbox
表中没有删除任何内容。
4.
Query q = em.createNativeQuery("DELETE FROM User_Inbox WHERE User_USERNAME = '" + username + "' AND Message_ID = '" + messageID + "'");
q.executeUpdate();
第四种方法效果很好。查询很顺利,正确删除了一条记录。
最后一种方法有效,但代码对我来说看起来不太整洁。如果有人能告诉我前三种方法我做错了什么,我将非常感激。
更新:
基于answer来自 D. Moore,我刚刚发现命名参数不能与 native 查询一起使用。这个answer中已经提到过作者:帕斯卡·蒂文特。
Named parameters follow the rules for identifiers defined in Section 4.4.1. The use of named parameters applies to the Java Persistence query language, and is not defined for native queries. Only positional parameter binding may be portably used for native queries.
最佳答案
我同意 (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();
关于java - native 查询产生 MySQL 语法错误和意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253850/