映射到没有外键的现有数据库时,可以在grails3域类中使用导航属性吗?

时间:2019-01-21 07:19:30

标签: grails gorm grails-domain-class

我们正在针对现有数据库使用Grails3。我们正在将域类映射到这些表,这些表没有没有外键定义

由于没有外键定义,因此我们不能在域类中使用导航属性。这使我们在需要进行联接查询时使用 HQL 。但是我们实际上更喜欢条件查询。

我们现有的没有外键定义的数据库表,也不允许添加其中任何一个。

示例表:

AREA_INFO {
    ID (System generated primary key)
    AREA_ID (This is the primary key we are using instead of ID.)
    AREA_NAME
}

PRODUCT_INFO {
    ID (System generated primary key)
    PRODUCT_ID (This is the primary key we are using instead of ID.)
    AREA_ID (This is AREA_INFO.AREA_ID)
    PRODUCT_NAME
}

域类示例:

class AreaInfo {
    Integer id
    Integer areaId
    String areaName

    static mapping = {
        version false

        table "AREA_INFO"
        id generator: "assigned", column: "ID"
        areaId column: "AREA_ID"
        areaName column: "AREA_NAME"
    }
}

class ProductInfo {
    Integer id
    Integer productId
    Integer areaId
    String productName

    static mapping = {
        version false

        table "PRODUCT_INFO"
        id generator: "assigned", column: "ID"
        productId column: "PRODUCT_ID"
        areaId column: "AREA_ID"
        productName column: "PRODUCT_NAME"
    }
}

需要进行联接查询时的示例HQL查询:

SELECT 
    product.productName,
    area.areaName
FROM
    ProductInfo AS product 
INNER JOIN 
    AreaInfo AS area ON area.areaId = product.areaId 
WHERE 
    product.productId = 1

下面是我们要使用的伪代码。但是,即使通过Google&Bing搜索后,我们也不知道如何进行映射。

class ProductInfo {
    Integer id
    Integer productId
    AreaInfo areaInfo
    String productName

    static mapping = {
        version false

        table "PRODUCT_INFO"
        id generator: "assigned", column: "ID"
        productId column: "PRODUCT_ID"
        productName column: "PRODUCT_NAME"
    }
}

ProductInfo.createCriteria().list {
    createAlias('areaInfo', 'areaInfo', JoinType.INNER_JOIN)

    eq("productId", 1)

    projections {
        property("productName")
        property("areaInfo.areaName")
    }
}
  • 我们不允许在表中添加外键。
  • 我们更喜欢使用条件进行查询。
  • 我们不需要级联。因此,我们可能不需要hasMany / belongTo定义。
  • 在这种情况下,我们可以用Grails3和GORM一对一,一对多以及多对多吗?

任何帮助将不胜感激。

0 个答案:

没有答案