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

Posted

技术标签:

【中文标题】如何获得适用于 H2 和 MariaDB 的序列的 nextVal【英文标题】:How to get nextVal of sequence that works for H2 as well as MariaDB 【发布时间】:2022-01-24 01:11:33 【问题描述】:

我使用 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 不喜欢这些字符串文字,但我怎样才能找到适用于两个数据库的解决方案?

如果你能帮助我,我会很高兴。 提前谢谢!

【问题讨论】:

【参考方案1】:

H2 和 MariaDB 都支持select next value for seq_stayId

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

【讨论】:

【参考方案2】:

您可以在 Spring Boot 中创建多个配置文件属性并在属性文件中管理值

1:应用程序-mariadb.properties

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

2:应用程序-h2db.properties

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

然后你可以在你需要的类中使用@Value注解绑定这个属性

@Component
    class YouClassName
        @Value("next.value.native.query")
        private String nextValueQuery;

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

    

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

【讨论】:

非常感谢您提供的有用提示!

以上是关于如何获得适用于 H2 和 MariaDB 的序列的 nextVal的主要内容,如果未能解决你的问题,请参考以下文章

您如何获得适用于 Android 的简单相机程序?

如何获得以下适用于 Android 的弧形动态变色动画?

如何使用MariaDB返回本地时间SQL结果

如何获得适用于 .NET 的 Sharp OSA SDK

如何使用适用于 Android 的 OpenCV 减少实时视频序列中的运动效果?

如何使用 H2 嵌入式数据库获取序列中的下一个值?