2017-12-19 15 views
0

私のアプリケーションでhibernate ogm 5.1を使用しています。このクエリを構成しています。このクエリ集約クエリのHibernate OGM結果

String query = "db.SWMessages.aggregate([ {0}, {1} ])"; 
    Document q1 = new Document("$match",new Document("messageUuid",new 
    Document("$ne" , id.toString()))); 
    Document q2 = new Document("$group", new Document("_id", 
    "$localReference").append("max", new Document("$max","$creationDate"))); 
    Object[] param = { q1.toJson(), q2.toJson() }; 
    String nativeQuery = MessageFormat.format(query, param); 
    List<SWMessageR> records = (List<SWMessageR>) em.createNativeQuery(nativeQuery, SWMessageImpl.class) 
      .getResultList(); 

は、上記のコードは、このようなクエリを生成します。

db.SWMessages.aggregate([ { "$match" : { "messageUuid" : { "$ne" : "9c1464d7-311d-4b50-8b81-005bad055232" } } } , { "$group" : { "_id" : "$localReference", "max" : { "$max" : "$creationDate" } } } ]) 

私の質問は、このクエリの結果はSWMessageRあるエンティティオブジェクトをバック返すだろうということですか?

答えて

0

あなたのクエリを実行する方法は、クラスのリストオブジェクトを返します。

List<SWMessageR> records = em.createNativeQuery(nativeQuery, SWMessageImpl.class).getResultList(); 

けれども、あなたは単一の結果を期待している場合には、私はこの方法を使用することをお勧め:

SWMessageR record = (SWMessageR) em.createNativeQuery(query1, SWMessageR.class).getSingleResult(); 
このように、あなたはこのようにそれを使用することができますので、キャストを使用する必要はありません

Hibernate Search Documentation Query Sectionをご覧ください。すべてがクリアされます。 乾杯。

+0

お返事ありがとうございます。しかし、上記のクエリは複数のエントリを持ち、あなたの提案する方法は役に立ちません。問題は、グループクエリによって返されたドキュメントが変換されるため、ハイバネートがクエリ結果をエンティティオブジェクトにマップできないという永続性例外が発生する可能性があり、mongoドキュメントを参照することをお勧めします。乾杯 – Invokergb

0

にHibernate OGMは、エンティティに結果を変換することができます:https://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html_single/#ogm-mongodb-queries-native

私はあなたのクエリが返すかわからないんだけど、それはあなたのエンティティを表し、コレクション内のドキュメントの場合、私はそれが動作するように期待しています。あなたは私たちのコードベースに例を見ることができます

:SWMessageRはエンティティクラスであると仮定すると

List<SWMessageR> results = em 
     .createNativeQuery(nativeQuery, SWMessageR.class) 
     .getResultList(); 

https://github.com/hibernate/hibernate-ogm/blob/master/mongodb/src/test/java/org/hibernate/ogm/datastore/mongodb/test/query/nativequery/MongoDBSessionCLIQueryTest.java#L111

予想さエンティティタイプに合格することを確認し、それは次のようになります。

+0

こんにちはダビデは返事をありがとう。 githubの例はマッチし、結果だけをソートします。戻りオブジェクトは実際にはエンティティです。 mongoでは、文書でグループ化すると、すべてのフィールドが投影されるわけではなく、変換されます。私の場合、結果は {_id:localReference、 max:maxDate}のタイプのいくつかのドキュメントです。これまでのところ、これは私のSWMessageRにマップすることはできません。クエリで、エンティティオブジェクトに存在するすべてのプロパティを投影すると、queyはEntityオブジェクトを返しますか? – Invokergb

+0

私は返されない値のnullを返すと期待します。しかし、私はテストでチェックしていないので、間違っているかもしれません。リンクしているクラスのテストがあなたのユースケースと一致しない場合は、そのクラスにあなたの状況を示す追加のテストを書くことができると思いますか?それはあなたの質問に答えるのに役立ちます。 – Davide