我有一个查询,如下所示:
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中?当我尝试这样做并编译时,它会抛出一个错误,抱怨 tokenWITH:
2017 年 6 月 19 日上午 10:38:58 org.hibernate.hql.internal.ast.ErrorCounter 报告错误 错误:第 1:1 行:意外标记:WITH 2017 年 6 月 19 日上午 10:38:58 org.hibernate.hql.internal.ast.ErrorCounter 报告错误 错误:第 1:1 行:意外标记:WITH 第 1:1 行:意外标记:WITH
Hibernate 不支持通用表表达式,但是如果您希望能够引用 SubQ 查询,这样就不必重复它,您可以将其定义为数据库上的视图,然后将 Hibernate 实体映射到该视图查看。
没有直接支持,但我能够使用 createNativeQuery API 与 MySQL 8.014 和 Hibernate 5.2.16 运行 CTE
EntityManager entityManager = _entityManagerFactory.createEntityManager();
Query q = entityManager.createNativeQuery(query, YourReturnTypePojo.class);
List<Object[]> a = q.getResultList();
Hibernate 6.2 现在支持 CTE (https://in.relation.to/2023/02/20/hibernate-orm-62-ctes/)