我最近正在使用mongoDB數據庫處理JAVA項目。因此,我決定使用eclipselink 2.4。關於查詢,它允許通常的「SQL like」查詢,但是(據說)允許本地mongoDB查詢。我跟着this tutorial,並把所有的工作。我能夠運行findOne()原生的MongoDB查詢(queryOne),但我不能夠運行找到()查詢(queryAll什麼也不做)......Eclipselink mongoDB本地查詢find()不起作用
查詢queryOne = em.createNativeQuery(」 db.ORDER.findOne()「, Order.class);查詢queryAll = em.createNativeQuery(「db.ORDER.find()」, Order.class);
Exception in thread "main" Local Exception Stack: Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.QueryException Exception Description: The primary key read from the row [EISMappedRecord( value => DBQuery: myTest.ORDER -> undefined)] during the execution of the query was detected to be null. Primary keys must not contain null. Query: ReadAllQuery(referenceClass=Order) at org.eclipse.persistence.exceptions.QueryException.nullPrimaryKeyInBuildingObject(QueryException.java:912) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:586) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:562) at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:776) at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:781) at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:433) at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1149) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:852) at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1108) at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:392) at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1196) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1549) at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:231) at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:411) at example.Test.testQuery(Test.java:171) at example.Test.main(Test.java:54)
查詢與訴諸MongoDB的外殼執行:
我執行查詢時出現錯誤
{ "_id" : "5061DC17E4B0881F592675A5", "TOTALCOST" : 3187, "SHIPPINGADDRESS" : [ { "POSTALCODE" : "L5J1H7", "COUNTRY" : "Canada", "PROVINCE" : "ON", "CITY" : "Ottawa", "STREET" : "17 Jane St." } ], "ORDERLINES" : [ { "DESCRIPTION" : "machine", "COST" : 2999, "LINENUMBER" : 1 }, { "DESCRIPTION" : "shipping", "COST" : 129, "LINENUMBER" : 2 }, { "DESCRIPTION" : "installation", "COST" : 59, "LINENUMBER" : 3 } ], "VERSION" : NumberLong(1), "DESCRIPTION" : "Pinball machine", "CUSTOMER__id" : "5061DC17E4B0881F592675A4", "BILLINGADDRESS" : [ { "POSTALCODE" : "L5J1H7", "COUNTRY" : "Canada", "PROVINCE" : "ON", "CITY" : "Ottawa", "STREET" : "17 Jane St." } ] }
{ "_id" : "5061DC17E4B0881F592675A6", "TOTALCOST" : 565, "SHIPPINGADDRESS" : [ { "POSTALCODE" : "L5J1H7", "COUNTRY" : "Canada", "PROVINCE" : "ON", "CITY" : "Ottawa", "STREET" : "17 Jane St." } ], "ORDERLINES" : [ { "DESCRIPTION" : "machine", "COST" : 500, "LINENUMBER" : 1 }, { "DESCRIPTION" : "balls", "COST" : 5, "LINENUMBER" : 2 }, { "DESCRIPTION" : "shipping", "COST" : 60, "LINENUMBER" : 3 } ], "VERSION" : NumberLong(1), "DESCRIPTION" : "Foosball", "CUSTOMER__id" : "5061DC17E4B0881F592675A4", "BILLINGADDRESS" : [ { "POSTALCODE" : "L5J1H8", "COUNTRY" : "Canada", "PROVINCE" : "ON", "CITY" : "Ottawa", "STREET" : "7 Bank St." } ] }
{ "_id" : "5061DC17E4B0881F592675A8", "TOTALCOST" : 402, "SHIPPINGADDRESS" : [ { "POSTALCODE" : "L5J1H7", "COUNTRY" : "Canada", "PROVINCE" : "ON", "CITY" : "Ottawa", "STREET" : "17 Jane St." } ], "ORDERLINES" : [ { "DESCRIPTION" : "table", "COST" : 300, "LINENUMBER" : 1 }, { "DESCRIPTION" : "balls", "COST" : 5, "LINENUMBER" : 2 }, { "DESCRIPTION" : "rackets", "COST" : 15, "LINENUMBER" : 3 }, { "DESCRIPTION" : "net", "COST" : 2, "LINENUMBER" : 4 }, { "DESCRIPTION" : "shipping", "COST" : 80, "LINENUMBER" : 5 } ], "VERSION" : NumberLong(1), "DESCRIPTION" : "Pingpong table", "CUSTOMER__id" : "5061DC17E4B0881F592675A7", "BILLINGADDRESS" : [ { "POSTALCODE" : "L5J1H8", "COUNTRY" : "Canada", "PROVINCE" : "ON", "CITY" : "Ottawa", "STREET" : "7 Bank St." } ] }
如果你能告訴我如何解決這個或一個小的解決方法,我將不勝感激。
編輯:JPQL查詢可以是有用的,我使用一些作爲解決方法,但是,我目前不能查詢引用ids。舉例來說,如果我有一個客戶參考訂單(訂單隻保存用戶的ID)與MongoDB的查詢,我會尋找像taht:
db.ORDER.find({"CUSTOMER__id": "ID"})
的JPQL類似的查詢,我相信這將是這樣的:
query = em.createQuery("Select o from Order o where o.customer.id = \"ID\"");
但是,再次...不工作!錯誤:
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-6168] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.QueryException
Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.ClassCastException: org.eclipse.persistence.eis.mappings.EISOneToOneMapping cannot be cast to org.eclipse.persistence.mappings.OneToOneMapping].
Internal Exception: java.lang.ClassCastException: org.eclipse.persistence.eis.mappings.EISOneToOneMapping cannot be cast to org.eclipse.persistence.mappings.OneToOneMapping
Query: ReadAllQuery(referenceClass=Order jpql="Select o from Order o where o.customer.id = "ID"")
at org.eclipse.persistence.exceptions.QueryException.prepareFailed(QueryException.java:1572)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:633)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:882)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:838)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1108)
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:392)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1196)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1549)
at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:231)
at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:411)
at example.Test.testQuery(Test.java:175)
at example.Test.main(Test.java:55)
Caused by: java.lang.ClassCastException: org.eclipse.persistence.eis.mappings.EISOneToOneMapping cannot be cast to org.eclipse.persistence.mappings.OneToOneMapping
at org.eclipse.persistence.internal.expressions.RelationExpression.checkForeignKeyJoinOptimization(RelationExpression.java:512)
at org.eclipse.persistence.internal.expressions.RelationExpression.normalize(RelationExpression.java:535)
at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1365)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:543)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1675)
at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:719)
at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:656)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:614)
... 13 more
感謝
您是否使用_List orders = queryAll.getResultList(); _獲取結果? – Anshu
是的,但它甚至沒有關係,甚至在我運行查詢之前,我得到了錯誤。我更新了問題以包含錯誤消息。 – lage
你可以對提示執行查詢並在此處發佈結果嗎? – Anshu