这些是通过JPA插入PostgreSQL时需要完成的事情。
1)将以下添加到插入末尾的"冲突无需做任何事情"的末尾(如果存在的话,或某些注释)
2)返回的生成的ID列
目前我正在使用以下方法,但它不会返回生成的列...
@Transactional
@Modifying
@Query(nativeQuery = true, value = "INSERT INTO table_name (value1) values(?1) ON CONFLICT DO NOTHING")
int insertWithoutConflict(Long value1);
我拥有的解决方案无需涉及JPA。
try(Connection conn = DatabaseUtils.getConnection()) {
Statement statement = conn.createStatement();
statement.execute(query, Statement.RETURN_GENERATED_KEYS);
ResultSet resultSet = statement.getGeneratedKeys();
if (resultSet.next())
return resultSet.getLong(1);
}
唯一的问题是,我正在规避我们当前的过程,然后必须开始实现连接池,而我不想参与其中。我想知道在JPA或Hibernate中是否可以使用此解决方案。
根据@kayaman
回答 @Transactional
@Query(nativeQuery = true, value = "INSERT INTO My_Table(value_1, value_2) values(?1, ?2) RETURNING any_column")
Long insertWithoutConflict(String value1, Long value2);
也可以返回我相信的模型对象
@Transactional
@Query(nativeQuery = true, value = "INSERT INTO My_Table(value_1, value_2) values(?1, ?2) RETURNING column_1, columnName_2, columnName_3, columnName_4")
YourModelObject insertWithoutConflict(String value1, Long value2);
删除@Modifying
注释,因为查询可能不会修改数据。
然后添加ON CONFLICT DO NOTHING RETURNING value1
(或RETURNING *
),但是您必须将int
更改为Integer
,因为冲突不会返回任何生成的值。