Hibernate OGM聚合查询的结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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?

答案

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

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

虽然,如果你期望一个结果,我建议使用这种方式:

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

看看Hibernate Search Documentation Query Section,一切都会很清楚。干杯。

另一答案

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是实体类。

以上是关于Hibernate OGM聚合查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate OGM 映射本机查询的@Embeddable 对象

wildfly 10上使用最新的 Hibernate ORM OGM

休眠 OGM Neo4j (5.0) Wildfly 10 错误。提供者 org.hibernate.ogm.service.impl.OgmIntegrator 不是子类型

使用Hibernate OGM和云MongoDB Atlas M0(免费层)

使用 Hibernate OGM 的 MongoDb 身份验证

Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?