在我的应用程序中,当 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 查询语言,并且未针对本机查询进行定义。只有位置参数绑定可以可移植地用于本机查询。