Я пытаюсь выполнить пакетную вставку некоторых записей, используя функцию пакетной вставки, предоставляемую QueryDSL. Тот же фрагмент кода работает, когда я использую только execute (), но затем приходится отдельно писать запрос на выборку, чтобы получить последние вставленные записи.
databaseAccessor.runInNewTransaction(databaseConnection -> {
SQLInsertClause batchInsert = databaseConnection.insert(TEST);
for (int i = 0; i < 5; i++) {
batchInsert.set(TEST.NAME, "label" + i).set(TEST.PROJECT_ID, 1).addBatch();
}
return batchInsert.executeWithKeys(TEST.ID);
}, OnRollback.NOOP);
Этот фрагмент кода работает для MySQL и PostgreSQL, но не работает для ORACLE и SQL Server. Есть ли способ сделать это, а также получить идентификатор вставленных записей.
Исключение я получаю следующим образом:
com.querydsl.core.QueryException: Caught SQLServerException for insert into "dbo"."AO_13764_TEST" ("NAME", "PROJECT_ID") values (?, ?)
at com.querydsl.sql.DefaultSQLExceptionTranslator.translate(DefaultSQLExceptionTranslator.java:50)
at com.querydsl.sql.Configuration.translate(Configuration.java:459)
at com.querydsl.sql.dml.SQLInsertClause.executeWithKeys(SQLInsertClause.java:408)
at com.qmetry.module.configuration.priority.dao.PriorityDAOImpl.lambda$5(PriorityDAOImpl.java:157)
at com.atlassian.pocketknife.internal.querydsl.DatabaseAccessorImpl.lambda$execute$0(DatabaseAccessorImpl.java:69)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutor.executeInternal(StandaloneTransactionalExecutor.java:79)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutor.lambda$execute$0(StandaloneTransactionalExecutor.java:35)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutorFactory$StandaloneHostConnectionAccessor.execute(StandaloneTransactionalExecutorFactory.java:56)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutor.execute(StandaloneTransactionalExecutor.java:35)
at com.atlassian.pocketknife.internal.querydsl.DatabaseAccessorImpl.execute(DatabaseAccessorImpl.java:67)
at com.atlassian.pocketknife.internal.querydsl.DatabaseAccessorImpl.runInNewTransaction(DatabaseAccessorImpl.java:38)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.delegateCall(StandaloneDatabaseAccessor.java:246)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.lambda$runInNewTransaction$1(StandaloneDatabaseAccessor.java:211)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.doWithConnection(StandaloneDatabaseAccessor.java:267)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.runInNewTransaction(StandaloneDatabaseAccessor.java:211)
at com.qmetry.module.configuration.priority.dao.PriorityDAOImpl.testBatchInsert(PriorityDAOImpl.java:152)
at com.qmetry.module.configuration.priority.dao.PriorityDAOTest.testDefaultPriorityBatchnsert(PriorityDAOTest.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: ****The statement must be executed before any results can be obtained.****
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getGeneratedKeys(SQLServerStatement.java:2207)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.vibur.dbcp.proxy.AbstractInvocationHandler.targetInvoke(AbstractInvocationHandler.java:109)
at org.vibur.dbcp.proxy.StatementInvocationHandler.newProxiedResultSet(StatementInvocationHandler.java:134)
at org.vibur.dbcp.proxy.StatementInvocationHandler.doInvoke(StatementInvocationHandler.java:80)
at org.vibur.dbcp.proxy.StatementInvocationHandler.doInvoke(StatementInvocationHandler.java:40)
at org.vibur.dbcp.proxy.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80)
at com.sun.proxy.$Proxy14.getGeneratedKeys(Unknown Source)
at com.querydsl.sql.dml.SQLInsertClause.executeWithKeys(SQLInsertClause.java:391)
at com.qmetry.module.configuration.priority.dao.PriorityDAOImpl.lambda$5(PriorityDAOImpl.java:157)
at com.atlassian.pocketknife.internal.querydsl.DatabaseAccessorImpl.lambda$execute$0(DatabaseAccessorImpl.java:69)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutor.executeInternal(StandaloneTransactionalExecutor.java:79)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutor.lambda$execute$0(StandaloneTransactionalExecutor.java:35)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutorFactory$StandaloneHostConnectionAccessor.execute(StandaloneTransactionalExecutorFactory.java:56)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneTransactionalExecutor.execute(StandaloneTransactionalExecutor.java:35)
at com.atlassian.pocketknife.internal.querydsl.DatabaseAccessorImpl.execute(DatabaseAccessorImpl.java:67)
at com.atlassian.pocketknife.internal.querydsl.DatabaseAccessorImpl.runInNewTransaction(DatabaseAccessorImpl.java:38)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.delegateCall(StandaloneDatabaseAccessor.java:246)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.lambda$runInNewTransaction$1(StandaloneDatabaseAccessor.java:211)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.doWithConnection(StandaloneDatabaseAccessor.java:267)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneAoDatabaseAccessor$MockitoMock$201014501.doWithConnection$accessor$hn7RGFKL(Unknown Source)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneAoDatabaseAccessor$MockitoMock$201014501$auxiliary$mSxKFWDA.call(Unknown Source)
at org.mockito.internal.invocation.RealMethod$FromCallable$1.call(RealMethod.java:40)
at org.mockito.internal.invocation.RealMethod$FromBehavior.invoke(RealMethod.java:62)
at org.mockito.internal.invocation.InterceptedInvocation.callRealMethod(InterceptedInvocation.java:152)
at org.mockito.internal.stubbing.answers.CallsRealMethods.answer(CallsRealMethods.java:43)
at org.mockito.Answers.answer(Answers.java:100)
at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:103)
at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:35)
at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:61)
at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:49)
at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor$DispatcherDefaultingToRealMethod.interceptSuperCallable(MockMethodInterceptor.java:108)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneAoDatabaseAccessor$MockitoMock$201014501.doWithConnection(Unknown Source)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneDatabaseAccessor.runInNewTransaction(StandaloneDatabaseAccessor.java:211)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneAoDatabaseAccessor$MockitoMock$201014501.runInNewTransaction$accessor$hn7RGFKL(Unknown Source)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneAoDatabaseAccessor$MockitoMock$201014501$auxiliary$YiJXxMpN.call(Unknown Source)
at org.mockito.internal.invocation.RealMethod$FromCallable$1.call(RealMethod.java:40)
at org.mockito.internal.invocation.RealMethod$FromBehavior.invoke(RealMethod.java:62)
at org.mockito.internal.invocation.InterceptedInvocation.callRealMethod(InterceptedInvocation.java:152)
at org.mockito.internal.stubbing.answers.CallsRealMethods.answer(CallsRealMethods.java:43)
at org.mockito.Answers.answer(Answers.java:100)
at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:103)
at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:35)
at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:61)
at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:49)
at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor$DispatcherDefaultingToRealMethod.interceptSuperCallable(MockMethodInterceptor.java:108)
at com.atlassian.pocketknife.test.util.querydsl.StandaloneAoDatabaseAccessor$MockitoMock$201014501.runInNewTransaction(Unknown Source)
... 27 more