1

私は最近、mongoDBデータベースを使用してJAVAプロジェクトに取り組んでいます。そのため、eclipselink2.4を使用することにしました。クエリに関しては、通常の「SQLのような」クエリを許可しますが、(おそらく)ネイティブのmongoDBクエリも許可します。私はこのチュートリアルに従い、すべてを機能させました。findOne()ネイティブmongoDBクエリ(queryOne)を実行できますが、find()クエリを実行できません(queryAllは機能しません)...

  1. クエリqueryOne=em.createNativeQuery( "db.ORDER.findOne()"、Order.class);

  2. クエリ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クエリは便利です。回避策としていくつか使用していますが、現在、参照IDをクエリすることはできません。たとえば、mongoDBクエリを使用した顧客参照付きの注文(注文には顧客のIDのみが保存されます)がある場合、次のように検索します。

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

ありがとう

4

2 に答える 2

0

主キーがnullであるオブジェクトをフェッチしようとしているようです。さらに、レコードは次A5, A6 and A8.のように作成された場合、A7が台無しになっているように見えますか?

ORDERドキュメントを削除して、テスト(挿入および取得)を再度実行することは可能でしょうか?

于 2012-09-25T16:48:10.333 に答える
0

ネイティブ MongoDB API を介して find() が findOne() と同じように機能するとは思わない。

クラスなしでネイティブ クエリを実行するとどうなるでしょうか。

つまり、クエリ queryAll = em.createNativeQuery("db.ORDER.find()"); queryAll.getResultList();

あなたは何を返しますか?

ネイティブの find() が直接サポートされているとは思いません (ただし、ほとんどのクエリで JPQL を使用できます)。これについてバグを記録してください。動作させる方法があるはずです。

于 2012-09-26T13:23:11.353 に答える