通过CriteriaUpdate更新全部失败,NativeQuery成功

时间:2017-04-28 09:43:26

标签: java eclipselink criteria-api

我有一个原生查询,通过我的N:M表计算与TaxaCatalog的连接TaxaLinkTaxaCatalogs

注意:在映射中,这些表仅映射,它们没有链接/连接,因为M:N仅与weaving一起使用,在当前配置中 (不是动态的,也不是静态的)!

<named-native-query name="UpdateTaxaCountForAllTaxaCatalogs">
    <query>UPDATE tTaxaCatalogs
            SET tacTaxaCount = (
                SELECT COUNT(*)
                FROM tTaxaLinkTaxaCatalogs
                WHERE tTaxaCatalogs.tacIdCatalog = tTaxaLinkTaxaCatalogs.tltIdCatalog)
    </query>
</named-native-query>

输出:

[EL Fine]: sql: Connection(236858974)--UPDATE tTaxaCatalogs
                SET tacTaxaCount = (
                    SELECT COUNT(*)
                    FROM tTaxaLinkTaxaCatalogs
                    WHERE tTaxaCatalogs.tacIdCatalog = tTaxaLinkTaxaCatalogs.tltIdCatalog)

并更新数据库中的值。

我尝试使用Criteria API实现完全相同的功能:

EntityManager em = ...// get EntityManager from Testsystem
CriteriaBuilder cb = em.getCriteriaBuilder();
// UPDATE tTaxaCatalogs
CriteriaUpdate<TaxaCatalogImpl> updateQuery = cb.createCriteriaUpdate(TaxaCatalogImpl.class);
Root rootTaxaCatalog = updateQuery.from(TaxaCatalogImpl.class);

// subQuery = 
Subquery<Long> sq = updateQuery.subquery(Long.class);
// FROM tTaxaLinkTaxaCatalogs
Root<TaxaLinkTaxaCatalogImpl> rootTaxaLinkTaxaCatalog = sq.from(TaxaLinkTaxaCatalogImpl.class);
// SELECT COUNT(*)
        sq.select(cb.count(rootTaxaLinkTaxaCatalog.get(TaxaLinkTaxaCatalogEnum.taxonId.name())));
// WHERE tTaxaCatalogs.tacIdCatalog = tTaxaLinkTaxaCatalogs.tltIdCatalog
sq.where(//
    cb.equal(//
        rootTaxaCatalog.<Integer> get(TaxaCatalogEnum.id.name()), //
        rootTaxaLinkTaxaCatalog.<Integer> get(TaxaLinkTaxaCatalogEnum.catalogId.name())//
    )//
);//
// SET tacTaxaCount = subQuery
updateQuery.set(rootTaxaCatalog.get(TaxaCatalogEnum.taxaCount.name()), sq);

em.getTransaction().begin();
try {
    Query query = em.createQuery(updateQuery);
    String sql = query.unwrap(JpaQuery.class).getDatabaseQuery().getSQLString();
    System.out.println("SQL Query for Update is");
    System.out.println(sql);

    int result = query.executeUpdate();
    assertEquals(ExpectedResults, result);
} catch (Exception e) {
    em.getTransaction().rollback();
    e.printStackTrace();
}
em.getTransaction().commit();

导致以下输出:

SQL Query for Update is
null
[EL Warning]: Local Exception Stack: 
Exception [EclipseLink-6168] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.QueryException
Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.NullPointerException].
Internal Exception: java.lang.NullPointerException
Query: UpdateAllQuery(referenceClass=TaxaCatalogImpl )
    at org.eclipse.persistence.exceptions.QueryException.prepareFailed(QueryException.java:1596)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:685)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:615)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:872)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:803)
    at org.eclipse.persistence.queries.ModifyAllQuery.executeInUnitOfWork(ModifyAllQuery.java:148)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:298)
    at at.biooffice.osgi.service.eclipselink.impl.TestUpdateAllTaxaCountsOnTaxaCatalog.UpdateTaxaCountForAllTaxaCatalogsCriteria(TestUpdateAllTaxaCountsOnTaxaCatalog.java:89)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    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.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.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.internal.expressions.SubSelectExpression.printSQL(SubSelectExpression.java:267)
    at org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter.translateExpression(ExpressionSQLPrinter.java:306)
    at org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter.printExpression(ExpressionSQLPrinter.java:129)
    at org.eclipse.persistence.internal.expressions.SQLUpdateAllStatement.buildSimple(SQLUpdateAllStatement.java:161)
    at org.eclipse.persistence.internal.expressions.SQLUpdateAllStatement.buildCall(SQLUpdateAllStatement.java:82)
    at org.eclipse.persistence.descriptors.ClassDescriptor.buildCallFromStatement(ClassDescriptor.java:815)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.setCallFromStatement(StatementQueryMechanism.java:390)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.prepareUpdateAll(StatementQueryMechanism.java:361)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareUpdateAll(ExpressionQueryMechanism.java:2287)
    at org.eclipse.persistence.queries.UpdateAllQuery.prepare(UpdateAllQuery.java:224)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:666)
    ... 33 more

javax.persistence.PersistenceException: Exception [EclipseLink-6168] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.QueryException
Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.NullPointerException].
Internal Exception: java.lang.NullPointerException
Query: UpdateAllQuery(referenceClass=TaxaCatalogImpl )
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:308)
    at at.biooffice.osgi.service.eclipselink.impl.TestUpdateAllTaxaCountsOnTaxaCatalog.UpdateTaxaCountForAllTaxaCatalogsCriteria(TestUpdateAllTaxaCountsOnTaxaCatalog.java:89)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    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.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.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: Exception [EclipseLink-6168] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.QueryException
Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.NullPointerException].
Internal Exception: java.lang.NullPointerException
Query: UpdateAllQuery(referenceClass=TaxaCatalogImpl )
    at org.eclipse.persistence.exceptions.QueryException.prepareFailed(QueryException.java:1596)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:685)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:615)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:872)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:803)
    at org.eclipse.persistence.queries.ModifyAllQuery.executeInUnitOfWork(ModifyAllQuery.java:148)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:298)
    ... 24 more
Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.internal.expressions.SubSelectExpression.printSQL(SubSelectExpression.java:267)
    at org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter.translateExpression(ExpressionSQLPrinter.java:306)
    at org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter.printExpression(ExpressionSQLPrinter.java:129)
    at org.eclipse.persistence.internal.expressions.SQLUpdateAllStatement.buildSimple(SQLUpdateAllStatement.java:161)
    at org.eclipse.persistence.internal.expressions.SQLUpdateAllStatement.buildCall(SQLUpdateAllStatement.java:82)
    at org.eclipse.persistence.descriptors.ClassDescriptor.buildCallFromStatement(ClassDescriptor.java:815)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.setCallFromStatement(StatementQueryMechanism.java:390)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.prepareUpdateAll(StatementQueryMechanism.java:361)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareUpdateAll(ExpressionQueryMechanism.java:2287)
    at org.eclipse.persistence.queries.UpdateAllQuery.prepare(UpdateAllQuery.java:224)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:666)
    ... 33 more

我找不到自己的错误。你能吗?

0 个答案:

没有答案