我正在构建一个Grails应用,其中包含用户可以用多种语言输入的数据。英语被认为是未找到翻译时显示的默认语言。在这个网站上浏览了一下后,我最终得到了以下域类。
class SomeData {
String name // Default English name
String description // Default English description
int otherData
double moreData
....
SomeDataTranslation translation
static transients = ['translation']
static hasMany = [translations: SomeDataTranslation]
def getName() {
if (translation) return translation.name
return name
}
}
class SomeDataTranslation {
String languageCode
String name // Name in some other language
String description // Description in some other language
static belongsTo = [data: SomeData]
}
我正在尝试将其设置为理想情况下使用一个SQL语句进行查询。那么如何使用GORM填充瞬态“转换”成员变量?基本用例是我需要将SomeData实例列表作为JSON返回,并使用翻译后的文本(如果存在)。所以我希望能够做一个简单的查询,返回SomeData实例,如果存在所请求语言的翻译,则设置'translation'成员变量。
我摸索了派生属性,但得出的结论是派生属性只能从其他属性派生。我无法使用语言代码请求参数。
修改
按照塞尔吉奥·米歇尔斯的建议,我一直试图用HQL做这件事,我很诱人,但还没有。这就是我到目前为止所做的:
def query = 'select sd,dt from SomeData as sd, SomeDataTranslation as sdt
where sd.name like ? and sdt.data = sd and sdt.languageCode = ?'
def queryParams =["something%", "es"]
def result = SomeData.executeQuery(query, queryParams, [readOnly: true])
def dataList = []
result.each {
it[0].translation = it[1]
SomeData someData = it[0]
someData.translation = it[1] // Fill the transient 'translation' property
dataList << someData
}
我遇到的问题是'where'子句过滤掉根本没有翻译的SomeData实例。我正在使用左连接来确保查询返回所有带有搜索字符串“something”的SomeData实例,并且我希望当没有转换时,'translation'属性为null。如果我删除'sdt.languageCode =?'过滤器,我得到所有语言的所有翻译。那么如何在保留空值的同时过滤所需的语言?
答案 0 :(得分:0)
您可以使用executeQuery在一个查询中同时返回SomeData
和SomeDataTranslation
。这将为您返回一个数组,然后您需要手动分配转换。
SomeData getSomeData() {
def result = SomeData.executeQuery(' from SomeData sd, SomeDataTranslation sdt where sdt.data = sd', [max: 1])
println result //[SomeData , SomeDataTranslation]
SomeData sd = result[0]
sd.translation = result[1]
return sd
}
值得一提的是,这使用Hibernate's HQL syntax来构建查询。