JOOQ store () не возвращает ResultSet - PullRequest
1 голос
/ 28 октября 2019

После этого Я пытаюсь создать новую запись студента, присвоить ей некоторые значения и сохранить ее в базе данных.

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:
Таблица учеников содержит не более четырех значений, показанных выше. Модель сгенерирована автоматически, и выбор уже выполнен.
Конец редактирования 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 из базы данных для обновления идентификатора в моем приложении.

Мне нужны записи и идентификаторы, так как мне нужно вставить многозначения с внешними ключами.

1 Ответ

1 голос
/ 29 октября 2019

jOOQ с использованием SQL Server OUTPUT для извлечения данных результатов из операторов DML - это новая функция из jOOQ 3.12: # 4498 . В версии 3.12.2 есть несколько известных проблем, в том числе:

Ваша информация еще не была известна. Я обновлю свой ответ, как только узнаю больше об этом.

Обходным путем может быть отключение создания предложения OUTPUT в SQL Server, которое все равно должно работать для однострочных операторов DML, таких как ваш. Установите свой флаг Settings.renderOutputForSQLServerReturningClause на false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...