Мы используем 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 для одного к одному, один ко многим и много ко многим при таком сценарии?
Буду признателен за любую помощь.