如何在 grails 命名查询中编写“不存在”查询?

Posted

技术标签:

【中文标题】如何在 grails 命名查询中编写“不存在”查询?【英文标题】:How can I write a "not exists" query in grails named queries? 【发布时间】:2013-08-15 13:57:08 【问题描述】:

如何在休眠条件或命名查询中编写“不存在”查询?我正在尝试获取一个命名查询不存在的查询,它返回与此 Oracle SQL 查询相同的结果:

select *
from SCHOOL a
where not exists (select 1
from STUDENT b
where B.SCHOOL_ID=a.id
and B.STATUS_ID not in (0,1,2,3,4))

【问题讨论】:

显示您尝试过的内容.. 我已经尝试过 HQL。我想在命名查询中实现它,因为我将在我的应用程序中大量使用它。我不想用 Oracle SQL 语法弄乱应用程序。 【参考方案1】:

在 HQL 中:

select s from School s where not exists (
    select st.id from Student st 
    where st.school = s 
    and st.statusId not in (0,1,2,3,4))

【讨论】:

有没有办法将 HQL 放在命名查询中? 这就是命名查询的原理:它是一个有名字的HQL查询。我不明白你的问题。 在域对象上实现静态 namedQueries = mynamedquery 时。它需要一个 HibernateCriteriaBuilder 定义。有没有办法为 HibernateCriteriaBuilder 编写 HQL? 根据我的经验,忘记不使用 HQL。它可以做的事情比标准查询容易得多。不过那只是我的 2c。 @user2679352 你没有明白这一点。 Criteria/NamedQuery 在执行时最终会转换为 HQL 查询。你可以直接使用上面的HQL。此外,您可以在使用此查询为您提供结果的域类中创建一个静态方法/闭包,并像使用动态查找器一样使用它。【参考方案2】:

使用sqlRestriction。这将直接在最终查询中注入,因此您需要使用数据库列名。

School.createCriteria().list 
  sqlRestriction(" not exists(select 1 from student s where s.school_id = this_.id and ...)")

【讨论】:

不是 sqlRestriction 使应用程序依赖于底层数据库引擎。是否有扩展 HibernateCriteriaBuilder 的库? 我猜你的意思是存在。 @user2679352 是的,但这个查询对我来说似乎很标准。如果您不使用数据库功能,那么您就可以使用了。另一种解决方案是使用 HQL,就像 JB 回答你一样。 你怎么知道使用 this_ 作为 School 表。这是在休眠文档的某处提到的吗? @mowwwalker 我查看了生成的查询

以上是关于如何在 grails 命名查询中编写“不存在”查询?的主要内容,如果未能解决你的问题,请参考以下文章

命名查询中的 Grails GORM 计数函数

使用 MongoDB 在 Grails 中命名查询的列表方法中排序不区分大小写

Grails 命名查询

Grails 命名查询 - 按关联查找

grails 命名查询返回不正确的数据

如何在 jpa 中为 EmbeddedId 编写选择命名查询?