如何获得适用于 H2 和 MariaDB 的序列的 nextVal

How to get nextVal of sequence that works for H2 as well as MariaDB

我使用 MariaDB 作为生产数据库,使用 H2 数据库进行测试。

我的问题: 我有一个查询来获取序列的下一个值,如下所示:

Query query = this.entitymanager.createNativeQuery("select nextval(seq_stayId)");

这在 MariaDB 上运行良好,但在 H2 数据库上不起作用。但是,如果我将查询更改为以下内容:

Query query = this.entitymanager.createNativeQuery("select nextval('seq_stayId')");

它适用于 H2 数据库,但不适用于 MariaDB。我知道 MariaDB 不喜欢这些字符串文字,但我怎样才能找到适用于两个数据库的解决方案?

如果你能帮助我,我将非常高兴。 提前致谢!

select next value for seq_stayId H2 和 MariaDB 都支持。

NEXT VALUE FOR sequenceName 是 SQL 标准的一部分,你真的应该使用它来代替各种特定于供应商的表达式,尤其是当你需要在不同的环境中执行相同的 SQL数据库系统。

您可以在 spring 引导和管理属性文件中的值中创建多个配置文件属性

1: 申请-mariadb.properties

next.value.native.query=select nextval(seq_stayId)

2: 申请-h2db.properties

next.value.native.query=select nextval('seq_stayId')

然后你可以在你需要的 class

中使用 @Value 注释绑定这个 属性
@Component
    class YouClassName{
        @Value("next.value.native.query")
        private String nextValueQuery;

        public void whatEverIsYourMethodName() {
            Query query = this.entitymanager.createNativeQuery(nextValueQuery);
        }

    }

然后您可以根据您需要的环境激活您的数据库配置文件。此外,如果您有特定于现有 dev/prod/test 或任何其他环境的数据库,那么您可以直接在现有环境属性文件

中使用该 属性