当前位置: 首页 > 知识库问答 >
问题:

想要在spring中使用jdbctemplate将字节数组插入到oid类型的postgres列中

乐欣可
2023-03-14

我正在使用Spring框架中的JdbcTemplate。

数据库是Postgres。

问题是我正在 java 中读取.cer文件,并希望将此证书的内容存储到列类型 OID 并使用 jdbctemplate 的后退数据库中,但得到异常是

列“cert_file”是类型的,但表达式是类型的字节

下面是代码

final String sql1 = "INSERT INTO sp_certificate_detail " +
                            "(public_key,cert_file)values(?,?)";

                    status = jdbcTemplate.update(new PreparedStatementCreator() {

                        @Override
                        public PreparedStatement createPreparedStatement(
                                Connection connection) throws SQLException {

                            PreparedStatement ps = connection.prepareStatement(
                                    sql1, new String[] { "cert_id" });                                
                            ps.setString(1, spreg.getPublicKey());
                            ps.setBytes(2, spreg.getCertFileContent());//This is byte[] of type
                           return ps;
                        }
                    }, keyHolder);
To get certiticate content am using below code
cfb = CertificateFactory.getInstance("X.509");
X509Certificate certb = (X509Certificate) cfb.generateCertificate(fileInputStream);
spreg.setCertFileContent(certb.getEncoded());

请任何人建议解决方法

我尝试将 byte[] 转换为 LOB,然后得到不同的异常

大型对象不能在自动提交模式下使用。;嵌套异常是org.postgresql.util。PSQLException:在自动提交模式下不能使用大型对象

代码如下

ps.setBlob(10, (new SerialBlob(spreg.getCertFileContent())));

共有2个答案

滑弘扬
2023-03-14

将下面的一段代码与您的代码集成,应该可以工作。

import org.postgresql.largeobject.LargeObject;
import org.postgresql.largeobject.LargeObjectManager;

(在postgresql-jdbc-jar中提供的包)

LargeObjectManager largeObjectManager = null;

LargeObject largeObject = null;

Long largeObjectRef = null;

largeObjectManager = ((org.postgresql.PGConnection) connection).getLargeObjectAPI();

largeObjectRef = largeObjectManager.createLO(LargeObjectManager.READ |    LargeObjectManager.WRITE);

largeObject = largeObjectManager.open(largeObjectRef, LargeObjectManager.WRITE);

largeObject.write("string/file content to write into oid column".getBytes());

largeObject.close();

包括需要设置的其余代码/参数,以及以下内容,

ps.setLong(2, largeObjectRef);

ps.executeUpdate();
茅炯
2023-03-14

我已将列类型更改为bytea,现在它可以工作

 类似资料:
  • 问题内容: 说我有一个postgres表,如下所示: 我什至可以使用Spring Data插入列或?如果可能的话,它看起来如何作为存储库和实体?我还没有找到任何解决此问题的文档或示例,可能是因为它与更常见的用例重叠,并以一对多关系插入到多个表中。说到这,我完全打算使用Postgresql 数据类型,并且不使用任何关系表。 问题答案: 您需要创建自己的类型并实现。根据下一个响应,我编写了一个泛型,可

  • 问题内容: 我正在尝试将字节数组插入sqlite数据库的blob列中。我已经尝试过使用setBinaryStream和setBytes,但是我无法通过SQLite JDBC驱动程序异常来实现。我正在使用sqlite-jdbc-3.8.7.jar。我应该使用哪个jar来完成这项工作?谢谢! 这是我的代码: 问题答案: 一旦对象已经与创建 该对象已经处理了命令文本。是时候执行PreparedState

  • 问题内容: 我在将Integer数组插入Postgresql Table时遇到问题,该如何解决? 其中ballNumbers和ballNumbersMegaBall是ArrayList。填充2位数字。 这是PostgreSQL表: 这是Springboot的错误: 发生意外错误(类型=内部服务器错误,状态= 500)。PreparedStatementCallback; 错误的SQL语法[INSE

  • 我在向Postgresql表中插入整数数组时遇到问题,我该怎么做? 其中ball Numbers和ball NumbersMegaBall是ArrayList。用两位数填充。 以下是PostgreSQL表: 这是来自Springboot的错误: 出现意外错误(类型=内部服务器错误,状态=500)。PreparedStatementCallback;错误的SQL语法[INSERT in draw_r

  • 我们使用spring frameworks jdbcTemplate插入数据,如下所示: 但这给出了一个例外: badsqlgrammareXception:PreparedStatementCallback;错误的SQL语法[插入test1值(?,?)];嵌套异常是org.PostgreSQL.util.psqlException:错误:列“id”是整数类型,但表达式是字符变化类型错误:列“id

  • 初始情况:我有这两个实体,杂货清单和产品。 杂货清单:一个杂货清单可以有几种产品。 产品:一个产品可以分配给多个杂货店 实体和关系存储在Postgres中的三个不同表中(一个用于列表,一个用于产品,一个用于关系映射表)。 映射表:映射表"lists_products" 示例产品:Id=4的示例产品 问题是:我正在尝试创建新的列表,这很有效。但是,正如您可以从映射表图像中看到的那样,Hibernat