如何解决使用条件在 Grails 2 中查询关联
我正在使用 Grails 2 并拥有以下域:
问题设置
class Container {
String name
Parcel slot1
Parcel slot2
Parcel slot3
static constraints = {
slot1 nullable: true
slot2 nullable: true
slot3 nullable: true
}
}
class Parcel {
String name
Category category
static constraints = {
category nullable: false;
}
}
class Category {
String name
}
要完成的任务
使用 DetachedCriteria 按包裹类别过滤集装箱。相应的 sql 看起来像:
SELECT * FROM container c
LEFT JOIN parcel p1 on c.slot1_id = p1.id
LEFT JOIN parcel p2 on c.slot2_id = p2.id
LEFT JOIN parcel p3 on c.slot3_id = p3.id
WHERE
p1.category_id = 1 OR
p2.category_id = 1 OR
p3.category_id = 1
从这个开始,我尝试了不同的解决方案,但都没有奏效:
def containerCriteria = new DetachedCriteria<>(Container)
def cat = Category.get(params.categoryFilter)
containerCriteria = containerCriteria.build {
or {
slot1 {
eq('category',cat)
}
slot2 {
eq('category',cat)
}
slot3 {
eq('category',cat)
}
}
}
问题
现在假设我们使用这些域进行初始化:
Category catA = new Category(name: "A").save(failOnError: true)
Category catB = new Category(name: "B").save(failOnError: true)
// Note that all odd numbers are of category A
Parcel p1 = new Parcel(name: "Parcel 1",category: catA).save(failOnError: true)
Parcel p2 = new Parcel(name: "Parcel 2",category: catB).save(failOnError: true)
Parcel p3 = new Parcel(name: "Parcel 3",category: catA).save(failOnError: true)
Parcel p4 = new Parcel(name: "Parcel 4",category: catB).save(failOnError: true)
Parcel p5 = new Parcel(name: "Parcel 5",category: catA).save(failOnError: true)
Parcel p6 = new Parcel(name: "Parcel 6",category: catB).save(failOnError: true)
new Container(name: "containerA",slot1: p1).save(failOnError: true)
new Container(name: "containerB",slot1: p2,slot2: p3,slot3: p4).save(failOnError: true)
new Container(name: "containerC",slot1: p5,slot2: p6).save(failOnError: true)
当我过滤类别 A 时,我只会得到容器 B。给定的示例实际上应该返回所有三个容器作为结果,因为它们都至少有一个属于 A 类的包裹。
我已经尝试在插槽中包含 isNotNull,或在约束中使用 slot1(CriteriaSpecification.LEFT_JOIN) {..}
。看起来 grails 正在使用内部联接或空对象的一些问题。
注意:我在stackoverflow上看过类似的问题,但没有找到解决方案。这是示例代码:https://github.com/H3ADLESS/gorm-test
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。