防止 NHibernate 将 Returning 子句添加到生成的插入语句中

Posted

技术标签:

【中文标题】防止 NHibernate 将 Returning 子句添加到生成的插入语句中【英文标题】:Prevent NHibernate from adding Returning clause to generated insert statements 【发布时间】:2017-05-09 07:27:58 【问题描述】:

我目前正在使用 NHibernate 在我的数据库中创建条目,从使用 .NET 库的 API 提取数据以允许与之交互。我目前正在使用 Greenplum,不幸的是它不支持 RETURNING 子句(添加到 NHibernate 生成的查询的末尾)。

我想知道是否可以禁止在 INSERT 语句的末尾添加“返回 id”?就好像我在 Python 中使用 SQLAlchemy(我更熟悉)做类似的事情一样,我可以执行以下操作来防止添加 RETURNING 子句:

    engine = create_engine(conn_str, implicit_returning=False)

希望我提供了足够的信息,任何帮助将不胜感激。

亲切的问候,

亚当风格

【问题讨论】:

Greenplum 不是为单例插入语句设计的,因此如果您尝试插入很多行,即使您解决了这个问题,性能也会很差。您需要使用 gpload 来加载数据。 【参考方案1】:

您需要使用与您的数据库兼容的 SQL dialect。参考文档可能不完整,请查看 sources 以检查所有现有方言。 greenplum 目前似乎没有专门的方言。

由于它源自postgresql,您可以尝试使用 PostgreSQL 方言代替。这可能已经是您正在做的事情,但您需要使用一个不声称支持返回插入 (Dialect.SupportsInsertSelectIdentity)。 PostgreSQLDialect 并没有声称支持它,但 PostgreSQL81Dialect 和以后会这样做。所以试试PostgreSQLDialect

您可以改为为 Greenplum 编写和使用方言,方法是从最接近的合适的现有方言派生,然后覆盖需要更改的内容。 (如果你愿意,你可以 contribute 给 NHibernate。)

注意事项:

    当在插入时使用 ids 生成的 db-side 时会出现此问题,例如身份。使用其他生成器策略也可以避免麻烦,同时具有不会在ISession.Save 上立即触发insert 的额外好处,从而启用批处理,更好的工作单元语义,... 使用事务!否则,当 Dialect.SupportsInsertSelectIdentity 被禁用时,一个错误可能会导致您的应用程序无法检索插入的 id。 (以多种形式出现:NH-926、NH-2145、NH-3600。或者,您可以将connection.release_mode 配置属性设置为on_close。)

【讨论】:

以上是关于防止 NHibernate 将 Returning 子句添加到生成的插入语句中的主要内容,如果未能解决你的问题,请参考以下文章

mariadb 实用功能2 delete from table returning ... 数据恢复

如何将RETURNING更新查询用于DQL

NHibernate 事务和竞争条件

NHibernate - 如何使用 where 子句保存对象

使用 FORALL 和 RETURNING 插入表时如何获取 ROWID

Java JDBC 如何使用 RETURNING 语句处理更新查询