运行此查询时出现“节点没有数据类型”错误:
session.createQuery("select nextval( 'next_num_seq' )")
我知道这意味着我需要使它成为一个类的属性,但是我还没有找到一种方法来将一个序列添加到一个类中,只有如何让一个序列为一个类生成 ID。
有没有办法在不是 ID 生成器的 Hibernate 映射中包含序列?
运行此查询时出现“节点没有数据类型”错误:
session.createQuery("select nextval( 'next_num_seq' )")
我知道这意味着我需要使它成为一个类的属性,但是我还没有找到一种方法来将一个序列添加到一个类中,只有如何让一个序列为一个类生成 ID。
有没有办法在不是 ID 生成器的 Hibernate 映射中包含序列?
因此,这个问题是有效的,但解决方案的道路却朝着错误的方向前进。将序列映射到托管域实体不是一个“好”的想法,因为这是两个独立的概念。
序列,例如您尝试从 PostgreSQL 后端查询的序列,是为元组的主键值或 - 从ORM应用程序的角度 - Java 对象生成唯一 ID 的中心概念。因此,将它们的当前状态映射到域实体并不聪明。取而代之的是,将从这样的序列中提取的单个特定值设置next_num_seq
为一个特定的对象,以将其保存在关系数据库中。因此,此类域对象的相关类通过例如专用 ORM 注释(或通过类似方法)链接到该序列。
在接口的JavaDoc中,Session
我们找到createNativeQuery(String sql)
从接口继承的方法EntityManager
,另请参见此处。
描述如下:
Query createNativeQuery(java.lang.String sqlString)
创建Query实例以执行本机SQL 语句,例如更新或删除。
参数: sqlString - 本机 SQL 查询字符串
返回:新的查询实例
因此,您可以修改代码以对 PostgreSQL 数据库执行本机查询,如下所示:
Query q = session.createNativeQuery("select nextval( 'next_num_seq' )");
这使您可以选择将下一个有效序列值作为 along
或Number
实例读取以用于编程目的。
请注意:注意不要多次重用此值(对于多个对象),因为这可能会导致后端在使用时出现一致性问题,例如,在单独线程的上下文中。
希望这可以帮助。