ユーザーが複数の言語で入力できるデータを含む 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]
}
理想的には1つのSQLステートメントでクエリされるように、これを設定しようとしています。では、GORM を使用して一時的な「翻訳」メンバー変数を設定するにはどうすればよいでしょうか。基本的な使用例は、SomeData インスタンスのリストを JSON として返し、翻訳されたテキストが存在する場合はそれを使用する必要があるというものです。したがって、要求された言語の翻訳が存在する場合、「translation」メンバー変数が設定されている SomeData インスタンスを返す単純なクエリを実行できるようにしたいと考えています。
派生プロパティをいじりましたが、派生プロパティは他のプロパティからしか派生できないという結論に達しました。言語コード リクエスト パラメーターを使用できませんでした。
編集
Sérgio Michels の提案に従って、私は 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 = ?」を削除すると、フィルター、すべての言語のすべての翻訳を取得します。では、null 値を保持しながら目的の言語をフィルター処理するにはどうすればよいでしょうか。