gpt4 book ai didi

java - Spring:如何在 PostgreSQL 中使用 KeyHolder

转载 作者:IT老高 更新时间:2023-10-28 13:55:02 26 4
gpt4 key购买 nike

最近迁移到 POSTGRESQL,我正在尝试获取在 db 表中创建新条目时唯一生成的 key 。 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" });

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

关于java - Spring:如何在 PostgreSQL 中使用 KeyHolder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17771306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com