如何获得适用于 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的主要内容,如果未能解决你的问题,请参考以下文章