我们正在针对现有数据库使用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")
}
}
任何帮助将不胜感激。