hibernate - Grails/hibernate 条件查询的“in all”限制

标签 hibernate gorm hibernate-criteria grails-2.0

我需要一种在Grails / Hibernate中“全部”条件查询的方法。标准的“in”限制是我称之为“in any”的限制。

举例来说...

前言

以域类“Knights”与另一个域类“Perils”具有多对多关联。这些 class 很简单...

class Knight {
  String name
  static hasMany = [perils:Peril]   
}

class Peril {
  String name
  static hasMany = [knights:Knight]
  static belongsTo = Knight
}

表格内容看起来像这样...
    Knights
    1 Arthur, King of the Britains (Not technically a knight. I know, I know.)
    2 Sir Bedevere the Wise
    3 Sir Lancelot the Brave
    4 Sir Robin the Not-Quite-So-Brave-As-Sir-Lancelot
    5 Sir Galahad the Pure

    Perils
    1 Black Knight
    2 Knights who say Ni
    3 Three-Headed Giant
    4 Swamp Castle
    5 Castle Anthrax
    6 Rabbit of Caerbannog

    Knights_Perils
    1, 1       // arthur fights the black knight
    1, 2       // arthur fights the knights who say ni
    2, 2       // bedevere fights the knights who say ni
    4, 3       // Robin runs-away from Three-Headed Giant
    3, 4       // Lancelot Assaults Swamp Castle
    5, 5       // Galahad visits Castle Anthrax
    3, 5       // Lancelot "rescues" Galahad from Castle Anthrax
    1, 6       // All Knights fight the Killer Bunny
    2, 6       // ...
    3, 6       // ...
    4, 6       // ...
    5, 6       // ...

I present a form that offers checkboxes to search on the association...

    Choose Perils and Search for Knights...
     [ ] Black Knight (id 1)
     [ ] Knights who say Ni (id 2)
     [ ] Three-Headed Giant (id 3)
     [x] Swamp Castle (id 4)
     [x] Castle Anthrax (id 5)
     [x] Killer Bunny (id 6)

     [search]

And I query like this:

def query = Knights.createQuery()
query.list(max: params.max, offset: params.offset) {
  if(params.perils) perils { 'in' ('id', params.list('perils')*.toLong()) }
}

这产生了我所谓的“任何”结果。骑士与已检查危险列表中的“任何”关联。对于上面表格中的3个经过检查的危险,所有骑士...

亚瑟-战斗兔子
Bedevere-战斗兔子
兰斯洛特-沼泽城堡,炭疽热城堡,与兔子搏斗
罗宾-战斗兔子
Galahad-炭疽城堡,与小兔子搏斗

问题

我正在寻找类似于“中”的Hibernate / Grails条件限制,但这将查询“全部”。换句话说,骑士与列表中所有“已检查”危险的关联。有了这个限制,并且上面输入了相同的表格,我希望结果只能是

兰斯洛特-沼泽城堡,炭疽热城堡,与兔子搏斗

是否有“全部”版本的Hibernate标准“包含”限制?

记住,我要使用CriteriaQuery(使用Hibernate或Grails方言)而不是直接使用SQL或HQL。

关于如何解决这个问题的任何指示?

谢谢!
  • 加里
  • 最佳答案

    好问题。也许有更好的选择,因为我不了解SQL / HQL的每个方面,但是下面的子句:

    all the selected perils are in the knight's perils
    

    也可以这样表达
    there is no peril in the selected perils that is not in the knight's perils
    

    因此,在HQL中,您可以这样表示:
    select knight from Knight knight
    where not exists (select peril.id from Peril peril 
                      where peril.id in :selectedPerilIds
                      and peril.id not in (select peril2.id from Peril peril2
                                           where peril2.knight.id = knight.id))
    

    关于hibernate - Grails/hibernate 条件查询的“in all”限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10444372/

    相关文章:

    unit-testing - 有什么办法可以使用GORM在模拟域对象中设置ID

    hibernate - org.hibernate.QueryException - 无法解析属性

    java - 使用 Criteria 运行子查询时出现 ClassCastException (String to Long)

    Spring 启动 : Executing the Newer version of SQL file each time we rebuild the application

    java - @UniqueConstraint 和 @Column(unique = true) 在 hibernate 注释中

    hibernate - Grails单元测试失败:此实现GORM当前不支持基于字符串的查询,例如[executeQuery]

    grails - Grails-唯一约束未按预期工作

    hibernate - @Temporal(TemporalType.DATE) 的问题

    java - Hibernate 工具给出 "Caused by: java.lang.NoSuchMethodError: javax.persistence.SequenceGenerator.catalog()Ljava/lang/String;"

    java - Hibernate 标准和/或多对多