Можем ли мы использовать свойство навигации в классе домена grails3 при сопоставлении с существующей базой данных, у которой нет внешнего ключа? - PullRequest
0 голосов
/ 21 января 2019

Мы используем 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 / ownTo.
  • Можем ли мы сделать это с Grails3 & GORM для одного к одному, один ко многим и много ко многим при таком сценарии?

Буду признателен за любую помощь.

...