Hibernate 我怎样才能写一个“a”;“不存在”;grails命名查询中的查询?

Hibernate 我怎样才能写一个“a”;“不存在”;grails命名查询中的查询?,hibernate,grails,Hibernate,Grails,如何在hibernate条件或命名查询中编写“不存在”查询?我正在尝试获取一个命名查询not exists查询,该查询返回与此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)) 使用sqlRestriction。这将直接注入到最终查询中,因此需要使用数据库列名 S

如何在hibernate条件或命名查询中编写“不存在”查询?我正在尝试获取一个命名查询not exists查询,该查询返回与此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))

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

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

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

School.createCriteria().list {
  sqlRestriction(" not exists(select 1 from student s where s.school_id = this_.id and ...)")
}
在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中:

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。我想在命名查询中实现它,因为我将在我的应用程序中大量使用它。我不想用Oracle SQL语法混乱应用程序。显示您尝试过的内容。我尝试过HQL。我想在命名查询中实现它,因为我将在我的应用程序中大量使用它。我不想用Oracle SQL语法混乱应用程序。SQL限制不是使应用程序依赖于底层数据库引擎吗。是否有扩展HibernateCriteriaBuilder的库?我想你的意思是不存在。@user2679352是的,但这个查询对我来说似乎很标准。如果不使用数据库功能,就可以继续使用。另一个解决方案是像JB回答你一样使用HQL。你怎么知道在学校表格中使用
这个
。这在hibernate文档中有提到吗?@mowwwalker我查看了生成的查询,而不是sqlRestriction使应用程序依赖于底层数据库引擎。是否有扩展HibernateCriteriaBuilder的库?我想你的意思是不存在。@user2679352是的,但这个查询对我来说似乎很标准。如果不使用数据库功能,就可以继续使用。另一个解决方案是像JB回答你一样使用HQL。你怎么知道在学校表格中使用
这个
。这在hibernate文档中有提到吗?@mowwwalker我查看了生成的查询是否有办法将HQL放入命名查询中?这就是命名查询的原理:它是一个有名称的HQL查询。我不明白你的问题。在域对象上实现静态namedquerys={mynamedquery{}}时。它需要一个HibernateCriteriaBuilder定义。有没有为HibernateCriteriaBuilder编写HQL的方法?以我的经验,忘记不使用HQL吧。它可以比标准查询简单得多。不过这只是我的2c。@user2679352你没有抓住重点。Criteria/NamedQuery在执行时最终转换为HQL查询。您可以直接使用上述HQL。此外,您可以在域类内创建一个静态方法/闭包,该类使用此查询提供结果,并以使用动态查找器的方式使用它。有没有办法将HQL放入命名查询中?这就是命名查询的原理:它是一个带名称的HQL查询。我不明白你的问题。在域对象上实现静态namedquerys={mynamedquery{}}时。它需要一个HibernateCriteriaBuilder定义。有没有为HibernateCriteriaBuilder编写HQL的方法?以我的经验,忘记不使用HQL吧。它可以比标准查询简单得多。不过这只是我的2c。@user2679352你没有抓住重点。Criteria/NamedQuery在执行时最终转换为HQL查询。您可以直接使用上述HQL。此外,您可以在域类内创建一个静态方法/闭包,该类使用此查询提供结果,并以使用动态查找器的方式使用它。