gpt4 book ai didi

java - 可以使用 Postgres 序列和 Hibernate 映射制作可查询的计数器吗?

转载 作者:行者123 更新时间:2023-11-29 12:55:20 24 4
gpt4 key购买 nike

运行此查询时出现“节点无数据类型”错误:

session.createQuery("select nextval( 'next_num_seq' )")

我知道这意味着我需要使它成为一个类的属性,但我还没有找到将序列添加到类的方法,只能找到如何使序列为类生成 ID。

有没有办法在不是 ID 生成器的 Hibernate 映射中包含一个序列?

最佳答案

因此,这个问题是有效的,但通往解决方案的道路却朝着错误的方向前进。将序列映射到托管域实体并不是一个“好”主意,因为这是两个独立的概念。

Sequences ,例如您尝试从 PostgreSQL 后端查询的那个,是为元组的主键值生成唯一 ID 的核心概念,或者 - 从 ORM 应用程序的角度来看 - Java对象。因此,将它们的当前状态映射到域实体并不明智。取而代之的是,设置一个从这样的序列中提取的单个特定值——例如next_num_seq - 进入一个特定的对象,以便在关系数据库中持久保存。因此,此类域对象的相关通过例如专用的 ORM 注释(或通过类似方法)链接到此序列。

JavaDocSession 接口(interface)中,我们找到了 createNativeQuery(String sql) 方法,它继承自 EntityManager 接口(interface),另请参见 here .

描述如下:

Query createNativeQuery(java.lang.String sqlString)

Create an instance of Query for executing a native SQL statement, e.g., for update or delete.

Parameters: sqlString - a native SQL query string

Returns: the new query instance

因此,您可以修改代码以对您的 PostgreSQL 数据库执行 native 查询,如下所示:

Query q = session.createNativeQuery("select nextval( 'next_num_seq' )");

这使您可以选择将下一个有效序列值读取为 longNumber 实例以用于编程目的。

请注意:注意不要多次重复使用此值(针对多个对象),因为这可能会在后端使用时导致一致性问题,例如,在单独线程的上下文中。

希望这对您有所帮助。

关于java - 可以使用 Postgres 序列和 Hibernate 映射制作可查询的计数器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44639282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com