Hibernate OGM 映射本机查询的@Embeddable 对象
Posted
技术标签:
【中文标题】Hibernate OGM 映射本机查询的@Embeddable 对象【英文标题】:Hibernate OGM mapping @Embeddable objects of native query 【发布时间】:2018-11-30 11:30:46 【问题描述】:如何在聚合后使用 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
【问题讨论】:
确保您使用的是 @javax.persistence.Entity 而不是 org.hibernate.annotations.Entity 我正在使用它。我将在上面的代码示例中添加 没有整个堆栈跟踪很难回答。启动时会发生吗?问题可能是实体未正确注册。如果它发生在查询执行之后,可能是因为查询结果没有返回 Hibernate OGM 对实体的期望。有什么理由不使用 HQL?您要运行哪种查询? 我的意思是,你只是想返回带有嵌入集合的实体吗?因为如果您使用 HQL 查询,OGM 将为您创建实体。 不,执行查询时会出现问题。我已经在启动时在 DB 中创建了一些文档,所以我认为一切都配置正确。所以是的,我认为返回值不正确,但我不知道缺少什么。我想从会话中返回平面事件数组。这可以用 HQL 完成吗? 【参考方案1】:在此处复制您的评论,因为它添加了一些细节:
我有这样的数据 [ id:'s1', events: [name: 'one',name: 'two'], id:'s2', events: [name: 'three',name: 'four'] ] 和我 想要这样的结果 [name: 'one',name: 'two',name: '三',名称:'四']
如果我在 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();
【讨论】:
【参考方案2】:无法识别实体,请确保您的所有实体也在 persistence.xml
可嵌入对象中
<class>org.example.package.MySessionEvent</class>
【讨论】:
如果这是问题,它会看到不同的错误。像Entity not mapped exception
这样的东西。除非另有配置,否则 Hibernate OGM 会自动发现实体。以上是关于Hibernate OGM 映射本机查询的@Embeddable 对象的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:使用@SqlResultSetMapping 映射本机查询的结果集
wildfly 10上使用最新的 Hibernate ORM OGM
休眠 OGM Neo4j (5.0) Wildfly 10 错误。提供者 org.hibernate.ogm.service.impl.OgmIntegrator 不是子类型