0

在我的应用程序中,当 aUser删除 a时Message,我需要删除 2 个实体之间的关系,同时保持它们完好无损。因此,我尝试使用以下方式直接从关系表中删除行:

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

第四种方法效果很好。查询顺利进行,一条记录被正确删除。

最后一种方法有效,但代码对我来说看起来不是很整洁。如果有人能告诉我我在第三种方法中做错了什么,我将不胜感激。

更新:

根据 D. Moore 的回答,我刚刚发现命名参数不能用于本机查询。Pascal Thivent在这个答案中已经提到了这一点。

命名参数遵循第 4.4.1 节中定义的标识符规则。命名参数的使用适用于 Java Persistence 查询语言,并且未针对本机查询进行定义。只有位置参数绑定可以可移植地用于本机查询。

4

1 回答 1

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();
于 2013-10-08T17:18:14.190 回答