JOOQ store() 不返回 ResultSet

Posted

技术标签:

【中文标题】JOOQ store() 不返回 ResultSet【英文标题】:JOOQ store() does not return ResultSet 【发布时间】:2020-02-23 18:58:42 【问题描述】:

按照this,我尝试创建一个新的学生记录,为其分配一些值并将其存储到数据库中。

DSLContext ctx = ...

StudentRecord s = ctx.newRecord(Student.STUDENT);
    s.setFirstname("Nicolas");
    s.setLastname("Nox");
    s.setGender("M");
    s.setYearOfBirth((short) 1990);
    s.store(); <-- ERROR

编辑 1:insert()编辑结束 1编辑 2: Student 表只包含上面显示的四个值。模型是自动生成的,到目前为止选择工作。编辑结束 2

编辑 3: 正如这里所问的,学生的表定义和 JDBC 驱动程序的依赖关系。

create table [LECTURE_DB].[dbo].[STUDENT](
[ID] int identity(1, 1) not null,
[FIRSTNAME] nvarchar(20) not null,
[LASTNAME] nvarchar(20) not null,
[YEAR_OF_BIRTH] smallint null,
[GENDER] nvarchar(1) null,
constraint [PK__STUDENT__3214EC277F60ED59]
  primary key ([ID]),
  constraint [STUDENT_NAME_IDX]
  unique (
    [LASTNAME], 
    [FIRSTNAME]
  )
)

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>7.0.0.jre8</version>
</dependency>

编辑结束 3

这确实会在数据库中插入一个值,但记录没有正确更新。 抛出以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: org.jooq.exception.DataAccessException: SQL [declare @result table ([ID] int); insert 
into [LECTURE_DB].[dbo].[STUDENT] ([FIRSTNAME], [LASTNAME], [YEAR_OF_BIRTH], [GENDER]) output 
[inserted].[ID] into @result values (?, ?, ?, ?); select [r].[ID] from @result [r];]; The statement did not return a result set.
at org.jooq_3.12.1.SQLSERVER2014.debug(Unknown Source)
at org.jooq.impl.Tools.translate(Tools.java:2717)
at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:755)
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:383)
at org.jooq.impl.TableRecordImpl.storeInsert0(TableRecordImpl.java:206)
at org.jooq.impl.TableRecordImpl$1.operate(TableRecordImpl.java:177)
at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:130)
at org.jooq.impl.TableRecordImpl.storeInsert(TableRecordImpl.java:173)
at org.jooq.impl.UpdatableRecordImpl.store0(UpdatableRecordImpl.java:196)
at org.jooq.impl.UpdatableRecordImpl$1.operate(UpdatableRecordImpl.java:136)
at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:130)
at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:132)
at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:124)
at de.esteam.lecturedb.jooq.LectureDBSetup.insertInitialData(LectureDBSetup.java:49)
at de.esteam.lecturedb.jooq.LectureDBAnalysis.<init>(LectureDBAnalysis.java:77)
at de.esteam.lecturedb.jooq.LectureDBAnalysis.<clinit>(LectureDBAnalysis.java:44)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:206)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:464)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:405)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7535)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2438)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:208)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:183)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:317)
at org.jooq.tools.jdbc.DefaultPreparedStatement.executeQuery(DefaultPreparedStatement.java:94)
at org.jooq.impl.AbstractDMLQuery.executeReturningQuery(AbstractDMLQuery.java:1137)
at org.jooq.impl.AbstractDMLQuery.execute(AbstractDMLQuery.java:935)
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:369)
... 12 more

说明数据库中缺少的 ResultSet 以更新我的应用程序中的 ID。

我有点需要记录和 ID,因为我需要使用外键插入许多值。

【问题讨论】:

如果您发布更多代码会很有帮助。 StudentRecord 类是什么样的?失败的 JOOQ 代码是什么样的?数据库表是什么样的? 您介意将您的 JDBC 驱动程序版本添加到您的问题中吗? 另外:表定义 (CREATE TABLE ...) 会很有帮助 在编辑 3 中更新。希望这会有所帮助。 @LukasEder 【参考方案1】:

jOOQ 使用 SQL Server OUTPUT 从 DML 语句中获取结果数据是 jOOQ 3.12 的新功能:#4498。它在 3.12.2 版本中存在一些已知问题,包括:

https://github.com/jOOQ/jOOQ/issues/8917

你的还不知道。一旦我了解更多信息,我会更新我的答案。

解决方法可能是关闭在 SQL Server 中生成 OUTPUT 子句,这对于像您这样的单行 DML 语句仍然有效。将您的 Settings.renderOutputForSQLServerReturningClause 标志设置为 false

【讨论】:

以上是关于JOOQ store() 不返回 ResultSet的主要内容,如果未能解决你的问题,请参考以下文章

jooq 为 Oracle 返回没有时间的日期

jOOQ 插入查询并返回生成的键

使用 JOOQ 在通用插入中返回 id

使用 jOOQ UPserting 到 Postgres 表时返回更新的行数

有没有办法用 JOOQ 生成 DAO,findById 返回 Optional

连接多个表并选择共同字段时返回自定义 JOOQ 记录