[英]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.