微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用条件在 Grails 2 中查询关联

如何解决使用条件在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?