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
它无法识别实体,请确保所有实体都在 persistence.xml
可嵌入对象中
<class>org.example.package.MySessionEvent</class>
在此处复制您的评论,因为它添加了一些细节:
I have data like this [ {id:'s1', events: [{name: 'one'},{name:
'two'}]}, {id:'s2', events: [{name: 'three'},{name: 'four'}]} ] and I
want result like this [{name: 'one'},{name: 'two'},{name:
'three'},{name: 'four'}]
如果我 运行 在 MongoDB 本机上 运行 宁 return s 以下类型的结果的查询(我用一些随机数据填充它) :
{ "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();
请注意,我决定不 return 时间,因为在您的评论中您没有要求它,但这也有效:
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();
如何在聚合后使用 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
它无法识别实体,请确保所有实体都在 persistence.xml
可嵌入对象中
<class>org.example.package.MySessionEvent</class>
在此处复制您的评论,因为它添加了一些细节:
I have data like this [ {id:'s1', events: [{name: 'one'},{name: 'two'}]}, {id:'s2', events: [{name: 'three'},{name: 'four'}]} ] and I want result like this [{name: 'one'},{name: 'two'},{name: 'three'},{name: 'four'}]
如果我 运行 在 MongoDB 本机上 运行 宁 return s 以下类型的结果的查询(我用一些随机数据填充它) :
{ "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();
请注意,我决定不 return 时间,因为在您的评论中您没有要求它,但这也有效:
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();