java - native 查询产生 MySQL 语法错误和意外结果

标签 java mysql jakarta-ee jpa-2.0 sql-delete

在我的应用程序中,当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/

相关文章:

java - 具有可比用户对象的Java中的N元搜索树?

mysql - InnoDB vs MyISAM 用于小表 WordPress 博客

mysql - 使用分组结果集获取 MySQL 查询的一列中具有最大值的行

jsf - jsf 2.0 中重定向浏览器后退按钮

java - 扫描 DynamoDB 中特定哈希的所有排序键

java - 在默认包中构建(使用 ant)一个 jar,它是主要的

java - Android应用程序是真正的Java应用程序吗

python - 访问容器中的数据库

testing - Jakarta Cactus 备用?

Java "ajp-9009-AsyncTimeout"java.lang.OutOfMemoryError : Java heap space Errors 错误