java - 为什么静态数组不适用于 JPA?
问题描述
@Service
public class Executor {
@Autowired
private EntityManager entityManager;
@Transactional
public void deleteRows(Long[] ids, String table) {
entityManager.createNativeQuery("update " + table + " set flag =0 where id in ?1 ")
.setParameter(1, ids).executeUpdate();
}
}
标志字段是布尔值。
当调用方法 deleteRows([1,2,3],"test_table");
我无法理解的堆栈异常
Caused by: java.sql.SQLSyntaxErrorException: 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 'x'ACED0005757200115B4C6A6176612E6C616E672E4C6F6E673B7DE10AB2BBBC632B020000787000' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.5.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
解决方案
IN 子句中的参数必须是非Collection
数组。所以你必须将你的数组转换为让我们先将List
它设置为查询的参数。另请注意,根据您的 Hibernate 版本,您可能需要将 IN 子句括在括号“(”,“)”中,例如where id in (?1)
@Transactional
public void deleteRows(Long[] ids, String table) {
List<Long> idsList = Arrays.asList(ids);
entityManager.createNativeQuery("update " + table + " set flag =0 where id in ?1 ").setParameter(1, idsList ).executeUpdate();
}
推荐阅读
- c# - System.ArgumentException:数据源不能为空
- sql - 将单列日期列表转换为 SQL Server 中的多个日期范围
- c++ - 这个工厂函数有什么问题?
- oracle - 如何在 Oracle 过程中创建临时表/视图?
- sql - Laravel 查询生成器:这个命令是否可以免除 SQL 注入?
- c - 使用 C11 GCC 使数据读/写原子化
? - sql - 如果语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句不能有任何启用的触发器
- java - 使用 EasyMock 在 junit 测试用例中跳过方法调用?
- authentication - DNN 9 Persona Bar 登录后不可见
- html - iPhone上的页脚超出屏幕