Hibernate OGM聚合查询的结果

时间:2017-12-19 10:39:04

标签: java mongodb mongodb-query hibernate-ogm

我在我的应用程序中使用hibernate ogm 5.1并构建此查询。此查询

    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?

2 个答案:

答案 0 :(得分:0)

嗯,是的,执行查询的方式是返回类的List对象。这样你就不需要使用强制转换了,所以你可以像这样使用它:

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

但是,如果你期待一个结果,我建议使用这种方式:

SWMessageR record = (SWMessageR) em.createNativeQuery( query1, SWMessageR.class ).getSingleResult();

看看Source,一切都会清楚。 欢呼声。

答案 1 :(得分:0)

Hibernate OGM可以将结果转换为实体:https://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html_single/#ogm-mongodb-queries-native

我不确定您的查询返回了什么,但如果它是代表您实体的集合中的文档,我希望它可以正常工作。

您可以在我们的代码库中看到一个示例: https://github.com/hibernate/hibernate-ogm/blob/master/mongodb/src/test/java/org/hibernate/ogm/datastore/mongodb/test/query/nativequery/MongoDBSessionCLIQueryTest.java#L111

确保传递预期的实体类型,它看起来像这样:

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

假设SWMessageR是实体类。