如何在 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 命名查询中编写“不存在”查询?的主要内容,如果未能解决你的问题,请参考以下文章