Hibernate(HQL)是否支持公共表达式?

3

我有一个查询看起来像这样:

WITH SubQ AS
    (SELECT elh.encntr_id, elh.location_cd
     FROM encntr_loc_his elh
     WHERE ...)
SELECT e.encntr_id
FROM encounter e
WHERE e.location_cd IN
    (SELECT SubQ.location_cd
     FROM...)
...

这个查询中还有一些其他的细节,而且SubQ已经被广泛使用。我的问题是,是否可以将此查询作为命名查询(namedquery)放入HQL中?当我尝试这样做并编译时,它会抛出一个关于token WITH的错误:

Jun 19, 2017 10:38:58 AM org.hibernate.hql.internal.ast.ErrorCounter reportError 错误:第1行1列:意外的token:WITH Jun 19, 2017 10:38:58 AM org.hibernate.hql.internal.ast.ErrorCounter reportError 错误:第1行1列:意外的token:WITH 第1行1列:意外的token:WITH

2个回答

4

Hibernate不支持常用表达式,但如果您想要引用您的子查询以避免重复,则可以将其定义为数据库上的视图,然后将Hibernate实体映射到该视图。


我想这可能是一个被接受的答案,但是问题提出者不活跃。 - Alex Yu
@Hedley,虽然没有直接的支持,但我能够使用MySQL 8.014和Hibernate 5.2.16的createNativeQuery API来运行CTE。 - DebashisDeb

1

虽然没有直接的支持,但我能够使用MySQL 8.014和Hibernate 5.2.16的createNativeQuery API运行CTE。

EntityManager entityManager = _entityManagerFactory.createEntityManager();
Query q = entityManager.createNativeQuery(query, YourReturnTypePojo.class);
List<Object[]> a =  q.getResultList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接