2012-09-25 68 views
1

我最近正在使用mongoDB數據庫處理JAVA項目。因此,我決定使用eclipselink 2.4。關於查詢,它允許通常的「SQL like」查詢,但是(據說)允許本地mongoDB查詢。我跟着this tutorial,並把所有的工作。我能夠運行findOne()原生的MongoDB查詢(queryOne),但我不能夠運行找到()查詢(queryAll什麼也不做)......Eclipselink mongoDB本地查詢find()不起作用

  1. 查詢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 

感謝

+0

您是否使用_List orders = queryAll.getResultList(); _獲取結果? – Anshu

+0

是的,但它甚至沒有關係,甚至在我運行查詢之前,我得到了錯誤。我更新了問題以包含錯誤消息。 – lage

+1

你可以對提示執行查詢並在此處發佈結果嗎? – Anshu

回答

0

看來它試圖獲取具有主鍵爲空的對象。此外,記錄是A5, A6 and A8.如果按順序創建A7,看起來像是亂七八糟的?

是否可以刪除ORDER文檔並再次運行測試(插入並獲取)?

+0

這些ID都可以,A7考慮到代碼中存在的順序,將成爲客戶。每次運行測試時,我都會刪除整個數據庫並從頭開始創建它... – lage

+0

我看到..看起來不像您代碼中的錯誤。我們必須缺少一些東西 – Anshu

+0

Yap ...恐怕find()查詢可能不被支持,但是沒有任何文檔說明... 感謝您的幫助... – lage

0

我不認爲find()與本地MongoDB API的findOne()相同。

當您在沒有該類的情況下執行本機查詢時會發生什麼?

即 查詢queryAll = em.createNativeQuery(「db.ORDER.find()」); queryAll.getResultList();

你回來了什麼?

我不認爲原生find()是直接支持的(但您可以對大多數查詢使用JPQL)。請爲此記錄一個錯誤,應該有一些方法讓它工作。

+0

嗨,謝謝響應。 當我運行沒有類我得到一個classCast excpetion(org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform不能轉換爲org.eclipse.persistence.platform.database.DatabasePlatform),所以我假設這種方法不是支持nosql。 關於JPQL查詢,我更新了JPQL問題,如果你可以看看;) 謝謝 – lage

+0

請爲這兩個問題記​​錄一個錯誤。 – James

+0

對於第二個問題,請嘗試使用o.customer =:customer並將實例作爲參數傳遞,也可以映射customerId或定義查詢鍵。 – James