首页 > 解决方案 > 为什么静态数组不适用于 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]

标签: javamysqlspringjpa

解决方案


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

推荐阅读