saveOrUpdate 在带有 H2 数据库的 Spring Data 中不起作用

Posted

技术标签:

【中文标题】saveOrUpdate 在带有 H2 数据库的 Spring Data 中不起作用【英文标题】:saveOrUpdate doesn't work in Spring Data with H2 database 【发布时间】:2019-01-25 16:10:37 【问题描述】:

我的程序中有 for 循环,我将新对象保存到数据库。好像

for (String value: readvalue.readValue()) 
            Value value= getValueForSomething(something);
            System.out.println(value);
            valueRepository.save(value);
        

这段代码每 30 秒执行一次,并将所有值保存到数据库中。数据库中的某些值具有两个相同的字段和另一个。如何更新 h2 数据库中的值而不是插入新值?

【问题讨论】:

【参考方案1】:

我建议在您的 for 循环中创建一个方法,通过使用唯一标识符(如 id)查询该对象来检查您的 H2 DB 中是否已存在该对象。使用以下示例 RDB 查询作为参考:

    private static final String PRODUCT_ALREADY_EXISTS_QUERY = "SELECT EXISTS(SELECT 1"
        + " FROM inventory.products "
        + " WHERE 1 = 1"
        + " AND id = :id)";

然后,如果记录确实存在,则调用一个更新方法,该方法利用一个查询来使用唯一标识符进行更新。一个 RDB 示例查询是:

    private static final String UPDATE_QUERY = "UPDATE inventory.products"
        + " SET (company_id, name, price, type, quantity, created_date, last_modified_date) = "
        + " (:companyId, :productName, :price, :productType, :quantity, :createdDate, :lastModifiedDateTime)"
        + " WHERE id = :id ";

如果记录不存在,那么只需像您一样创建记录。

【讨论】:

以上是关于saveOrUpdate 在带有 H2 数据库的 Spring Data 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有 h2 嵌入式数据库的 MySQL LONGTEXT

在 AWS 上部署带有 H2 数据库的 Spring Boot 应用程序

带有忽略大小写的 JDBC URL 不适用于 H2 数据库连接

带有 Spring JPA 的 H2 中的几何数据类型

是否可以在带有 h2 或 sybase 数据库的 android 上使用 ormlite?

带有 H2 的永久数据库