0

聚合后如何使用 Hibernate OGM 从 MongoDB 中读取 @Embeddable 对象列表。

我有这样的实体

@javax.persistence.Entity
public class MySession implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Type(type = "objectid") 
    private String id;
    private Date start;
    private Date end;
    @ElementCollection
    private List<MySessionEvent> events;
}

和@Embeddable 对象

@javax.persistence.Embeddable
public class MySessionEvent implements Serializable {
    private Long time;
    private String name;
}

我坚持从本机查询映射可嵌入对象

String queryString = "db.MySession.aggregate([" +
            "   { '$match': { 'events.name': { '$regex': 'Abrakadabra'} }}, " +
            "   { '$unwind': '$events' }, " +
            "   { '$replaceRoot': { 'newRoot': '$events'}} " +
            "])";

List<MySessionEvent> objects = em.createNativeQuery(queryString, MySessionEvent.class).getResultList();

我收到一个错误Caused by: org.hibernate.MappingException: Unknown entity

4

2 回答 2

1

在此处复制您的评论,因为它添加了一些详细信息:

我有这样的数据 [ {id:'s1', events: [{name: 'one'},{name: 'two'}]}, {id:'s2', events: [{name: 'three' },{name: 'four'}]} ] 我想要这样的结果 [{name: 'one'},{name: 'two'},{name: 'three'},{name: 'four'} ]

如果我在 MongoDB 上本地运行,您正在运行的查询将返回以下类型的结果(我用一些随机数据填充它):

{ "name" : "Event 3", "time" : NumberLong(3) }
{ "name" : "Abrakadabra", "time" : NumberLong(5) }

这不足以重建实体,这就是您看到异常的原因。

考虑到您只想要事件列表,这应该有效:

List<Object[]> poems = em.createNativeQuery( queryString ).getResultList();

Hibernate OGM 会将先前的结果转换为数组列表。List 的每个元素都是一个数组,其中数组的第一个值是事件的名称,第二个是时间。

对于像这样受支持的情况,我认为 HQL 查询更好。您可以使用以下代码重写相同的示例:

    String queryString = 
            "SELECT e.name " +
            "FROM MySession s JOIN s.events e " +
            "WHERE e.name LIKE 'Abrakadabra'";
    List<Object[]> events = em.createQuery( queryString ).getResultList();

请注意,我决定不返回时间,因为在您的评论中您没有要求,但这也可以:

    String queryString = 
            "SELECT e.time, e.name " +
            "FROM MySession s JOIN s.events e " +
            "WHERE e.name LIKE 'Abrakadabra'";
    List<Object[]> events = em.createQuery( queryString ).getResultList();
于 2018-12-04T11:31:48.593 回答
-1

它无法识别实体,请确保您的所有实体也在persistence.xmlEmbeddable 对象中

<class>org.example.package.MySessionEvent</class>
于 2018-11-30T19:08:22.100 回答