我需要一种在 Grails/Hibernate 中执行“全部”标准查询的方法。标准的“in”限制就是我所说的“in any”限制。
举例来说...
序言
以与另一个域类“Perils”具有多对多关联的域类“Knights”为例。课程很简单...
class Knight {
String name
static hasMany = [perils:Peril]
}
class Peril {
String name
static hasMany = [knights:Knight]
static belongsTo = Knight
}
表格内容看起来像这样......
骑士
1 亚瑟,不列颠国王(严格来说不是骑士。我知道,我知道。)
2 聪明的贝德维尔爵士
3 勇敢的兰斯洛特爵士
4 不像兰斯洛特爵士那样勇敢的罗宾爵士
5 纯洁的加拉哈德爵士
危险
1 黑骑士
2 说 Ni 的骑士
3 三头巨人
4 沼泽城堡
5 炭疽城堡
6 卡班诺兔
Knights_Perils
1, 1 // 亚瑟与黑骑士战斗
1, 2 // 亚瑟与说 ni 的骑士战斗
2, 2 //bedevere 与说 ni 的骑士战斗
4, 3 // 罗宾逃离三头巨人
3, 4 // 兰斯洛特突袭沼泽城堡
5, 5 // 加拉哈德参观炭疽城堡
3, 5 // 兰斯洛特从炭疽城堡“拯救”加拉哈德
1, 6 // 所有骑士都与杀手兔战斗
2, 6 // ...
3, 6 // ...
4, 6 // ...
5, 6 // ...
我提出了一个表单,它提供了用于搜索关联的复选框......
选择危险并寻找骑士...
[ ] 黑骑士 (id 1)
[]说Ni的骑士(id 2)
[ ] 三头巨人 (id 3)
[x] 沼泽城堡 (id 4)
[x] 炭疽城堡 (id 5)
[x] 杀手兔(id 6)
[搜索]
我这样查询:
def query = Knights.createQuery()
query.list(max: params.max, offset: params.offset) {
if(params.perils) perils { 'in' ('id', params.list('perils')*.toLong()) }
}
这产生了我所说的“任何”结果。Knight 与已检查危险列表中的“任何”关联。在上面表格中的3个检查危险的情况下,所有的骑士......
亚瑟 - 打兔子
Bedevere - 与兔子战斗
兰斯洛特 - 沼泽城堡、炭疽城堡、打兔子
罗宾 - 打兔子
Galahad - 城堡炭疽病,与兔子战斗
问题
我正在寻找类似于“in”的 Hibernate/Grails 标准限制,但它将查询“in all”。换句话说,Knight 与列表中“全部”检查的危险有关联。有了这个限制,以及上面相同的表单输入,我希望结果只有
兰斯洛特 - 沼泽城堡、炭疽城堡、打兔子
Hibernate 标准“in”限制是否有“in all”版本?
请记住,我想使用 CriteriaQuery(在 Hibernate 或 Grails 方言中)来执行此操作,而不是直接使用 SQL 或 HQL。
关于如何解决这个问题的任何指示?
谢谢!
- 加里