gpt4 book ai didi

hibernate - 本地插入后如何获取新的记录ID

转载 作者:行者123 更新时间:2023-12-03 17:04:12 27 4
gpt4 key购买 nike

出于一些很好的原因,我做了一个 spring 数据 jpa native 插入。
查询以正确的方式执行。
但我需要的是由 nextval('hibernate_sequence') 生成的新生成的表 ID

有没有办法获得这个ID?

这是我的查询:

/**
* Inserts a new file attachment.
* This is useful and maybe better suitable, because one may not want to load the whole
* job offer to fullfill the JobOffer -> FileAttachment OneToMany Relation
*
* @param file a given file
* @param fileName a given file name
* @param jobOfferId a given job offer id
* @return int the new id
*/
@Modifying
@Query(value = "insert into fileattachment(fileattachmentid, file, filename, joboffer_jobofferid) values (nextval('hibernate_sequence'), ?1, ?2, ?3);", nativeQuery = true)
int insertFileAttachment(String file, String fileName, long jobOfferId);

int 返回值仅给出插入记录的数量 (1)。
但我需要新的 ID。
我不想在另一个数据库查询插入后查询它。因为如果我必须这样做,整个 native 插入都会过时。

有人知道答案/有人有其他提示吗?
谢谢!
亲切的问候
托马斯

编辑 :
我使用 native 插入来避免加载整个 joboffer 记录,这是很多无用的数据,只是为了以实体管理器的方式持久化数据。

相反,我插入了 native 数据。

无论如何,您从插入语句返回数据的提示非常酷。
我正在尝试,它正在工作。非常非常感谢你!
我最终得到了这个解决方案:
/**
* Inserts a new file attachment.
* This is useful and maybe better suitable, because one may not want to load the whole
* job offer to fullfill the JobOffer -> FileAttachment OneToMany Relation
*
* @param file a given file
* @param fileName a given file name
* @param jobOfferId a given job offer id
* @return int the new id
*/
@Query(value = "insert into fileattachment(fileattachmentid, file, filename, joboffer_jobofferid) values (nextval('hibernate_sequence'), ?1, ?2, ?3) returning fileattachmentid;", nativeQuery = true)
long insertFileAttachment(String file, String fileName, long jobOfferId);

最佳答案

Is there a way to get this id?



不是没有查询数据库就没有。除非您愿意使用普通的 JDBC。

如果您的 FileAttachment有一个 @ManyToOne JobOffer offer ,你为什么不做以下事情:
FileAttachment attachment = new FileAttachment(file, fileName);
attachment.setJobOffer(entityManager.getReference(JobOffer.class, jobOfferId));
entityManager.persist(attachment);
entityManager.flush();
return attachment.getId();

这样,您将避免加载 JobOffer 的整个状态。 .如果关系是单向的,恐怕您必须检索整个 JobOffer .

或者,如果您真的必须使用 native INSERT ,请考虑在您的数据库中定义一个存储过程,该过程将插入数据并返回自动生成的 ID(请参阅 here)。

此外,一些数据库(例如 PostgreSQL)允许从 INSERT 返回数据。语句 ( INSERT (..) INTO FILEATTACHMENT RETURNING ID )。您可能需要去除 @Modifying注释,因为插入的 id 最终会出现在查询的结果集中。你没有提到你使用的是哪个数据库,但语法看起来像 Postgres,这就是我选择这个例子的原因。如果您使用另一个数据库,请查阅文档,也许有类似的功能。

但是,我仍然建议不要使用原生 INSERT JPA 应用程序中的语句。很多东西都可以打破。我怀疑您尝试实现的方法不是更大工作单元的一部分,但如果是这种情况,我会非常小心。

关于hibernate - 本地插入后如何获取新的记录ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50058212/

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