Плагин сервера Jira - Atlassian PocketKnife - QueryDSL - пакетная вставка с executewithKeys () не работает для ORACLE и SQL Server - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь выполнить пакетную вставку некоторых записей, используя функцию пакетной вставки, предоставляемую 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
...