如何使用 Spring 在 Postgresql 中存储 java.util.ArrayList

2024-04-20

我正在尝试批量插入一组 Bean。 bean 的属性之一是 ArrayList。批量更新失败,异常:

 Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use.

我不知道要使用哪种 Postgresql 数据类型才能兼容 ArrayList。有没有办法可以在不更改其属性的数据类型的情况下批量更新bean?


豆子:

    import java.util.List;

    public class SomeBean {
        private int id;
        private List<String> names;

        @Override
        public String toString() {
            return "SomeBean [id=" + id + ", names=" + names + "]";
        }
        //Setters and getters

表架构:

CREATE TABLE arraylistexample
(
  id serial NOT NULL,
  names character varying[]
)

插入数据的方法:

    public void insert(List<SomeBean> beans){
        String sql = "INSERT INTO ARRAYLISTEXAMPLE (NAMES) VALUES (:names)";

        SqlParameterSource[] data = SqlParameterSourceUtils.createBatch(beans.toArray());
        pgTemplate.batchUpdate(sql, data);
    }

例外情况:

Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO ARRAYLISTEXAMPLE (NAMES) VALUES (?, ?)]; nested exception is org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:98)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615)
    at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:884)
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters(NamedParameterBatchUpdateUtils.java:40)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:303)
    at some.package.dao.GenericDao.insert(GenericDao.java:45)
    at some.package.runner.FileLogicTester.storingArrayListInDb(FileLogicTester.java:220)
    at some.package.runner.FileLogicTester.main(FileLogicTester.java:86)
Caused by: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use.
    at org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1801)
    at org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:37)
    at org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:46)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:255)
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:351)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:216)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:144)
    at org.springframework.jdbc.core.BatchUpdateUtils.setStatementParameters(BatchUpdateUtils.java:63)
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.access$000(NamedParameterBatchUpdateUtils.java:32)
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils$1.setValues(NamedParameterBatchUpdateUtils.java:47)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:893)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:884)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    ... 7 more

有什么建议么?


我面临着同样的问题。Here http://www.postgresql.org/message-id/50344D58.9010401@ringerc.id.au人们对此进行了讨论。 看起来这是 JDBC 驱动程序或 PostgeSQL 本身的错误,所以你不能只将数组传递给数据库。作为一种解决方法,我必须手动创建 SQL(我有整数值,因此不关心 sql 注入;您可能需要动态准备SELECT * FROM MYTABLE WHERE ID IN (?,?,?)首先然后处理该语句)。

private static final String SQL_FIND_GOAL = "SELECT * FROM MYTABLE WHERE ID IN (:ids)";

public List<MyGoal> getAllMyGoals(Set<Integer> ids) {
// Work around of issue.
int i=0;
String mockInStatement = "";
for (int type: ids){
  if (i < ids.size()-1){
    mockInStatement = mockInStatement + type + ",";
  }
  else {
    mockInStatement = mockInStatement + type;
  }
  i++;
}
String refinedSQL = SQL_FIND_GOAL.replace(":ids",mockInStatement);

List<MyGoal> result = jdbcTemplate.query(
    refinedSQL, 
    new RowMapper<MyGoal>() {
      @Override
      public MyGoal mapRow(ResultSet rs, int rowNum) throws SQLException {
        MyGoal myGoal = new MyGoal();
        myGoal.setCode(rowNum);
        myGoal.setName(rs.getString("name"));
        return myGoal;
      }
    });
return result;  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Spring 在 Postgresql 中存储 java.util.ArrayList 的相关文章

随机推荐

  • Swift 4 编程三引号

    当他们说 它与结束引用的缩进匹配时 是什么意思 对于占用多行的字符串 请使用三个双引号 只要与结束引号的缩进相匹配 每个带引号的行开头的缩进就会被删除 例如 让引号 虽然左边有空格 实际的行没有缩进 除了这一行 双引号 可以出现而无需转义
  • 查找图像列表的中值

    如果我有一个由 3D ndarray 表示的图像列表 例如 x y color 我可以使用哪些操作来输出具有所有值中值的图像 我正在使用 for 循环 发现它太慢了 这是我使用的矢量化实现NumPy http www numpy org 在
  • 如何在带有流星的车把助手中使用多个参数?

    我正在尝试使用 Meteor 创建一个自定义助手 以下是此处的文档 https github com meteor meteor wiki Handlebars https github com meteor meteor wiki Han
  • UIButton 和外观 API - 支持与否?

    根据UIAppearance协议参考 http developer apple com library ios documentation UIKit Reference UIAppearance Protocol Reference Re
  • GCF 部署失败(区域/计费)

    我无法再部署功能 即使在其他项目上也是如此 我一如既往地部署gcloud functions deploy 现在我收到这个错误 Failed to initialize region action ID 5a9a2fb704b2df80 E
  • 在 Rails 5 应用程序记录类中包含一个模块

    我正在使用应用程序记录来简化整个应用程序的共享逻辑 下面是一个编写布尔值及其逆的范围的示例 这效果很好 class ApplicationRecord lt ActiveRecord Base self abstract class tru
  • 根据条件替换数据框中的行

    我有以下数据框 id f1 f2 1 a 1 3 2 b 3 5 3 c 4 7 我想用一行替换 f1 gt 3 的所有行 id x f1 0 f2 0 所以上面的内容会映射到 id f1 f2 1 a 1 3 2 b 3 5 3 x 0
  • C# 的 switch 语句区分大小写。有没有办法切换它,使其不区分大小写? [复制]

    这个问题在这里已经有答案了 C 的 switch 语句区分大小写 有没有办法切换它 使其不区分大小写 谢谢 但是 我不喜欢这些解决方案 因为 case 条件将是一个变量 并且我不知道它们是否都是 UPPER 或 lower 是的 使用ToL
  • 如何在交叉验证和GridSearchCV中实现SMOTE

    我对 Python 比较陌生 您能帮助我将 SMOTE 的实施改进为适当的管道吗 我想要的是在每次 k 次迭代的训练集上应用过采样和欠采样 以便模型在平衡的数据集上进行训练 并在不平衡的遗漏部分上进行评估 问题是 当我这样做时 我无法使用熟
  • 如何使 json 数据可用于我的 Vue 动态路由

    我有一个List我从中获取日期的组件db blogs json created fetch http localhost 3000 blogs then response gt return response json then data
  • 迭代索引属性(反射)

    我想迭代只能通过反射访问的索引属性 但是 我是在充分了解可能有一个令人尴尬的简单答案的情况下才这么说的 MSDN Google失败 除了在PropertyInfo GetValue prop counter 直到TargetInvocati
  • WhereNot linq 表达式

    我正在尝试创建一个扩展 WhereNot 所以我可以使用 Dim x Hello world Dim y x Split WhereNot AddressOf String IsNullOrEmpty 请注意 我的目标是学习 linq 表达
  • asp.net中displayfor和displaynamefor的简单解释是什么?

    我有课 public class Item public int ItemId get set Required ErrorMessage Category is required Range 1 int MaxValue ErrorMes
  • 当我的笔记本电脑使用电池时,是否可以让 Intellij 自动进入省电模式?

    我通常在插入交流电源的情况下工作 但有时我拔掉电源线并忘记将 Intellij 置于省电模式 我的电池很快就会耗尽电量 可以按照我的要求做吗 Please 遵循此功能请求 https youtrack jetbrains com issue
  • Docker:在其他容器中查找sendmail

    我正在学习如何将 Docker 与多个容器一起使用 而不是单个容器 我想学习如何从容器 A 调用位于容器 B 上的程序 即 我希望能够致电sendmail从我的web容器 同时sendmail和类似的程序位于mailhog容器 我有这个 d
  • dlclose() 不调用全局对象的析构函数

    插件1 cpp include
  • 无法在 SQL Server 2017 中创建 tSQLtCLR 程序集

    我最近安装了 SQL Server 2017 Express 和 localdb 正式版 在尝试安装 tSQLt 框架时 我发现了 SQL Server 2017 中实现的一项新安全功能 clr strict security 选项 这个新
  • C++ 并发性:互斥体外部的变量可见性[重复]

    这个问题已经存在了 我无法理解变量何时被强制写入内存 即使是在互斥块之外 我对下面的复杂代码表示歉意 因为我已经剥离了处理是否的逻辑reader决定某些数据是否陈旧 需要注意的重要一点是 99 9 的情况下 读者会采取fast path并且
  • 符合 Y2K 意味着什么?

    我正在阅读 Perl 编程语言基础知识 我遇到了以下语句 Perl is Y2K compliant 即使在谷歌搜索之后也不太明白它的意思 是否建立了某种标准 如果是的话 那么是谁做的呢 任何信息表示赞赏 对于 20 世纪 90 年代末从事
  • 如何使用 Spring 在 Postgresql 中存储 java.util.ArrayList

    我正在尝试批量插入一组 Bean bean 的属性之一是 ArrayList 批量更新失败 异常 Can t infer the SQL type to use for an instance of java util ArrayList