最近迁移到POSTGRESQL,我试图在db表中创建一个新条目时获得唯一生成的密钥.表screenstable如下所示:

CREATE TABLE screenstable
(
  id serial NOT NULL,
  screenshot bytea,
  CONSTRAINT screen_id PRIMARY KEY (id )
)

将数据插入screenstable的方法如下:

@Autowired NamedParameterJDBCTemplate template;
public int insertImage(ImageBean imageBean){
        String query = "insert into screenstable (screenshot) values (:image)";
        SqlParameterSource data = new BeanPropertySqlParameterSource(imageBean);
        KeyHolder keyHolder = new GeneratedKeyHolder();
        template.update(query, data, keyHolder);
        return keyHolder.getKey().intValue();
    }

ImageBean

import java.util.Arrays;

public class ImageBean {
    private int id;
    private byte[] image;
    @Override
    public String toString() {
        return "ImageBean [id=" + id + ", image=" + Arrays.toString(image)
                + "]";
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public byte[] getImage() {
        return image;
    }
    public void setImage(byte[] image) {
        this.image = image;
    }
}

但是运行代码会出现以下异常

15:33:20,953 ERROR JsonParseExceptionMapper:15 - org.springframework.dao.InvalidDataAccessApiUsageException: The getKey method should only be used when a single key is returned.  The current key entry contains multiple keys: [{id=3, screenshot=[B@db59df}]
org.springframework.dao.InvalidDataAccessApiUsageException: The getKey method should only be used when a single key is returned.  The current key entry contains multiple keys: [{id=3, screenshot=[B@db59df}]
        at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:65)
        at some.project.model.FeedbackDao.insertImage(FeedbackDao.java:20)
        at some.project.rest.FeedsRest.pluginCheck(FeedsRest.java:62)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597).....

同样的代码在MySQL的情况下可以正常运行,但在POSTGRES中使用时,键失败.数据类型serial是导致代码失败的原因,还是我正确使用了主键功能?

请给我一些建议.

推荐答案

如果框架没有被告知哪个列是键,它将返回表中的所有列作为键.

您可以通过向update方法传递一个新参数来通知它,如下所示:

template.update(query, data, keyHolder, new String[] { "id" });

See NamedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder, keyColumnNames)

Postgresql相关问答推荐

如何在Windows中安装sql for golang

PostgreSQL解释分析实际时间不加总

如何在PostgreSQL中以行值的形式获取列

如何诊断字符编码问题

Postgres 11没有强制执行外键约束?

错误:用户需要系统密码:postgres

Docker compose read connection reset by peer error on pipeline

订阅标签保存在哪个表中?

如何从 WSL 连接到 windows postgres 数据库

在 postgreSQL 中更改序列名称

NOT LIKE 带有 NULL 值的行为

在 PostgreSQL 数组中查找值的位置

如何在 postgresql 交叉表中用零替换空值

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

在 PostgreSQL 中 Select 进入临时表?

Postgis / Geodjango:无法确定数据库的 PostGIS 版本

处理用户发送的string contains null byte

SQL:子查询的列太多

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?

postgresql 删除级联