我需要一种在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/