gpt4 book ai didi

hibernate - Grails GORM-查找表

转载 作者:行者123 更新时间:2023-12-02 15:52:16 24 4
gpt4 key购买 nike

一般问题说明

我在将查询表传输到GORM(Grails对象关系映射)时遇到问题。

域类

我正在使用Grails 3.1.4,我的Domain类是MySystemMyVendorLookup:

class MySystem {
String productName
MyVendor vendor
static belongsTo = [myVendor: MyVendor]
static mapping = {
id column: "product_id", generator: "assigned"
table 'my_system_table'
version false
}
static constraints = {
productName nullable: true
}
}
class MyVendor {
String vendorName
static hasMany = [mySystems: MySystem]
static mapping = {
id column: "vendor_id", generator: "assigned"
version false
}
static constraints = {
vendorName nullable: true
}
}
class Lookup implements Serializable {
Integer systemId
Integer someIdA
Integer someIdB
int hashCode() {
def builder = new HashCodeBuilder()
builder.append systemId
builder.append someIdA
builder.append someIdB
builder.toHashCode()
}
boolean equals(other) {
if (other == null) return false
def builder = new EqualsBuilder()
builder.append systemId, other.systemId
builder.append someIdA, other.someIdA
builder.append someIdB, other.someIdB
builder.isEquals()
}
static mapping = {
id composite: ["systemId", "someIdA", "someIdB"]
version false
}
}

数据库表
mysystem表如下所示:
mysystem
product_id vendor_id product_name
1 1 ProductA
2 1 ProductB
3 3 ProductC

... ... ...
99 3 ProductAB
product_id列为 primary_key ,一个 product_id可以具有一个唯一的Vendor,这在GORM中通过在 static belongsTo = [myVendor: MyVendor] Domain类中定义 MySystem来体现。
myvendor表如下所示:
myvendor
vendor_id vendor_name
1 VendorA
2 VendorB
3 VendorC
... ...

在此表中, 主键vendor_id,通过查看此表无法感知到 mysystem表的逻辑链接。只有通过GORM才能将 mysystem设置为属性来建立到 static hasMany = [mySystems: MySystem]的逻辑链接。
lookup表如下所示:
lookup
system_id some_id_a some_id_b
3 99 1
3 88 1
3 22 1
... ... ...
1 77 1
2 88 1
2 22 1

所谓的 lookup表具有以下非正式含义:
  • ID为3的系统具有执行ID为99, 88, 22的任务的能力
  • 标识为1的系统具有较少的功能。它只能执行id为88
  • 的任务
  • ID为2的系统可以执行ID为7722的任务

  • 如您所见,在相应的域类 Lookup中,主键是所有列 (system_id,some_id_a,some_id_b)上的元组

    原始数据库查询

    当我想找到能够执行ID为 2288的任务的系统时,可以这样查询数据库:
    Select system_id from lookup a where some_id_a= 22 and some_id_b= 1 and 
    Exists (Select system_id from lookup where
    some_id_a= 88 and system_id = a.system_id)

    而本文中给出的示例集的结果将是:
    system_id
    2
    3

    当我想找到可以使用ids 99,88,22执行任务的系统时,可以对数据库执行以下查询:
    Select system_id from lookup a where some_id_a = 99 and some_id_b = 1 and
    Exists (Select system_id from lookup where
    some_id_a = 88 and system_id = a.system_id) and
    Exists (Select system_id from lookup where
    some_id_a = 22 and system_id = a.system_id)

    该查询将给我:
    system_id
    3

    我的原始查询以及针对数据库的代码中的HQL查询都能正常工作,但是我无法找到 Lookup Domain类的正确GORM属性映射,因此无法构建 GORM queries using criterias

    条件数据库查询

    例如,可以使用 criterias以以下方式使用此Service类:
    class MySystemService {
    def myMethod() {
    def criteria = MySystem.createCriteria()
    def results = criteria.list {
    eq("productId", 1)
    }
    return results
    }
    }

    这只会给我数据库中ID为1的产品。

    我不能做的是以下几点:
    class MySystemService {
    def myMethod() {
    def criteria = MySystem.createCriteria()
    def results = criteria.list {
    lookup{
    eq("systemId", 1)
    }
    }
    return results
    }
    }

    它给了我这个错误:
    groovy.lang.MissingMethodException: No signature of method: grails.orm.HibernateCriteriaBuilder.lookup() is applicable for argument types: (com.my.package.MySystemService$_getByParams_closure1$_closure2$_closure3) values: [com.my.package.MySystemService$_getByParams_closure1$_closure2$_closure3@59b6da8b]

    我知道这是因为我无法正确地将Domain类与映射连接在一起。由于Grails无法为Domain类的属性生成其样板代码。

    问题

    所有这些导致了以下问题:
  • 如何正确连接域类,以使GORM标准可以提取示例原始查询?
  • 与原始查询相对应的条件关闭最终会是什么样子?
  • 最佳答案

    为了按预期使用GORM,请考虑对象属性而不是表列。在GORM中,域类由属性关联,这会影响Hibernate生成SQL查询的方式。我在this文章中详细介绍。您可以执行以下操作:

    域类

    class MySystem {
    String productName
    MyVendor vendor
    static hasMany = [lookups: Lookup]
    static belongsTo = [myVendor: MyVendor]
    static mapping = {
    id column: "product_id", generator: "assigned"
    table 'my_system_table'
    version false
    }
    static constraints = {
    productName nullable: true
    }
    }

    class Lookup implements {
    Integer someIdA
    Integer someIdB
    static belongsTo = [mySystem: MySystem]
    static constraints = {
    someIdA unique: 'someIdB'
    }
    }

    标准查询示例
    class MySystemService {
    def myMethod() {
    def criteria = MySystem.createCriteria()
    def results = criteria.list {
    lookups {
    eq("someIdA", 1)
    }
    }
    return results
    }
    }

    关于hibernate - Grails GORM-查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37346434/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com