【问题标题】:Spring MVC JPA Native Insert With Generated Column ReturnedSpring MVC JPA 本机插入并返回生成的列
【发布时间】:2016-11-30 18:45:03
【问题描述】:

这些是我通过 JPA 插入 PostgreSQL 时需要完成的事情。

1) 插入表格,在插入末尾添加以下内容“ON CONFLICT DO NOTHING”(或一些注释,如果存在)

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);

【问题讨论】:

    标签: java spring postgresql hibernate jpa


    【解决方案1】:

    删除@Modifying 注释,因为它查询可能不会修改数据。

    然后添加ON CONFLICT DO NOTHING RETURNING value1(或RETURNING *),但您必须将int 更改为Integer,因为冲突不会返回任何生成的值。

    【讨论】:

    • 很好的答案,让我得到了我需要的最终答案。您能否修改您的答案并声明我需要删除修改,然后我可以返回您所说的整数值?修改使我没有得到结果。我删除了它,并且能够得到 Long 或 Integer 甚至是我正在使用的模型。我只需在传递的“返回”参数中返回该模型中的所有值。
    • 答案更新后我会接受!并希望它会帮助其他人:)
    • 试图弄清楚如何做到这一点的日子!惊人!这让我对这些东西的工作原理有了新的认识。很好的答案!感谢您的帮助:)
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2012-11-14
    • 2011-12-28
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多