簡體   English   中英

Hibernate OGM映射本機查詢的@Embeddable對象

[英]Hibernate OGM mapping @Embeddable objects of native query

聚合后如何使用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

在此處復制您的評論,因為它添加了一些詳細信息:

我有這樣的數據[{{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的每個元素都是一個數組,其中數組的firs值是事件的名稱,第二個是時間。

對於這種受支持的情況,我認為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();

它無法識別實體,請確保您所有的實體也都在persistence.xml

<class>org.example.package.MySessionEvent</class>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM