使用条件在 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.JdbcOdbc...