【问题标题】:Slick 2.0 "returning" an element is not working for H2 databaseSlick 2.0“返回”一个元素不适用于 H2 数据库
【发布时间】:2014-02-27 00:11:15
【问题描述】:

以下代码应该插入一个新条目并返回它(带有自动生成的 id)。它适用于 PostgreSQL。

val ret = elementTableQuery.returning(elementTableQuery) += Element("Arg1", "Arg2", "Arg3")

抛出的异常是:

JdbcSQLException: Invalid value "2" for parameter "columnIndex" [90008-172] (DbException.java:329)
org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
org.h2.message.DbException.get(DbException.java:169)
org.h2.message.DbException.getInvalidValueException(DbException.java:215)
org.h2.jdbc.JdbcResultSet.checkColumnIndex(JdbcResultSet.java:3088)
org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:3116)
org.h2.jdbc.JdbcResultSet.getString(JdbcResultSet.java:279)
ch.xxx.test.data.ElementCreator$.create(InitialDataCreator.scala:199)

如果我删除“返回”部分,该语句也有效(在 PortsgreSQL 和 H2 中)。如果我只返回生成的 Id,它也可以工作:

val ret = elementTableQuery.returning(elementTableQuery.map(_.id)) += Element("Arg1", "Arg2", "Arg3")

我发现了一个错误报告 (https://github.com/slick/slick/issues/230),它似乎与相同的问题有关,但由于无法复制而被关闭。

我应该打开一个新错误吗?我的查询有什么问题吗?

感谢您的任何意见。

【问题讨论】:

    标签: input return-value h2 slick slick-2.0


    【解决方案1】:

    根据http://slick.typesafe.com/doc/2.0.0/queries.html#inserting

    请注意,许多数据库系统只允许返回单个列,该列必须是表的自增主键。如果您要求其他列,则会在运行时引发 SlickException(除非数据库实际上支持它)。

    我不完全确定,但可能是 H2 只允许返回自增主键。这可以解释为什么会抛出这个异常。

    【讨论】:

    • 感谢您的回答,这正是我需要知道的。我将代码更改为仅返回自动生成的主键。
    【解决方案2】:

    看起来像一个错误。请打开一个问题并向我们提供足够的信息来重现该问题。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-08
      • 2016-02-12
      • 2019-11-05
      • 2018-08-05
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多