我有一个原生查询,通过我的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
我找不到自己的错误。你能吗?