我有一种方法试图使用HQL在数据库中进行相当复杂的查询。我的实体类都使用注释进行映射,并在编译期间被发现,而未明确列出。
在下面的代码中:
List<Message> ms = ((Session) entityManager.getDelegate())
.createCriteria(MessageCRI.class).list();
log.info("Got " + ms.size() + " CRIs");
List<Message> msgs = ((Session) entityManager.getDelegate())
.createQuery(
"from MessageCRI c where c.rfdId in (select id from MessageRFD rfd where rfd.ssrId = :ssrId)")
.setParameter("ssrId", ssrId).list();
第一次调用成功 - 我在日志中收到一条消息,说明“获得2个CRI”或某些内容。然而,下一次调用失败,产生一个stackdump,其根本原因是“org.hibernate.hql.ast.QuerySyntaxException:MessageCRI未映射”
我能错过什么?
答案 0 :(得分:3)
您的@Entity
注释是否收到name
? (在这种情况下,请使用它的名称)。
超出主题但由于您使用的是JPA EntityManager
,为什么不坚持使用JPQL syntax?如果您使用的是JPA 2,您甚至可以利用它的类型安全Criteria API。对于非常特定的情况,可能仍然需要本机语法,但是当您拥有该选项时遵循标准始终是一个不错的选择。
答案 1 :(得分:1)
HQL中的实体由其实体名称标识。默认情况下,它与其类的短名称匹配,但可以通过name
注释的@Entity
属性覆盖。确保不要覆盖它。