如何在springboot中的插入/更新期间通过触发器检索生成的字段,例如generated id或updated_at字段

xzabzqsa  于 2023-02-22  发布在  Spring
关注(0)|答案(1)|浏览(96)

在postgres中,可以使用returning来检索计算值。我有一个生成的id字段和一个名为updated_at的字段,每当行被修改时,该字段就会被触发器更新。我想实现这样的功能,但看起来不起作用。不确定这是否是批量插入的正确语法。

@Query(value = "INSERT INTO entities VALUES :values RETURNING *",nativeQuery = true)
List<Entity> insertAndReturn(@Param("values") List<Entity> entities);

错误为:

java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

我也研究过jdbctemplate,但似乎我们正在失去实体Map的好处,我们需要编写自己的定制Map器。

icnyk63a

icnyk63a1#

这是行不通的。原生SQL不支持多值参数。您必须单独列出所有参数。您可以尝试以下操作

default List<Entity> insertAndReturn(@Param("values") List<Entity> entities) {
    for (int i = 0; i < entities.size(); i++ ) {
        entities.set(i, insertAndReturn(entities.get(i)));
    }
    return entities;
}
default Entity insertAndReturn(Entity entity) {
    return insertAndReturn(entity.getColumn1(), entity.getColumn2());
}
@Query(value = "INSERT INTO entities_table(column1, column2) VALUES (:column1, :column2) RETURNING *",nativeQuery = true)
Entity insertAndReturn(@Param("column1") String column1, @Param("column2") String column2);

相关问题