この質問で Burt Beckwith が提供する解決策を見つけました。ユーザー定義プロパティをドメイン クラスに追加し、状況によってはこれが実行可能なオプションになると思います。これをテストする際に、参照された質問で説明されているように、Map プロパティを持つドメインがあります。これは簡略化されたバージョンです(マップ以外のプロパティは他にもありますが、この質問には関係ありません):
class Space {
String spaceDescription
String spaceType
Map dynForm
String toString() {
return (!spaceType)?id:spaceType + " (" + spaceDescription + ")"
}
}
「Test1」:「abc」や「Test2」:「xyz」のように、dynForm マップに任意のデータを保存したスペースのインスタンスがいくつかあります。
このデータのクエリを実行しようとしていますが、HQL を使用して次のようにフィルター処理することに成功しました。
String className = "Space"
Class clazz = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz
def res = clazz.executeQuery("select distinct space.id, space.spaceDescription from Space as space where space.dynForm['Test1'] = 'abc' " )
log.debug "" + res
selectステートメントでMap dynFormから個々のアイテムを選択する方法があるかどうか知りたいです。このようなもの:
def res = clazz.executeQuery("select distinct space.id, elements(space.dynForm['Test1']) from Space as space where space.dynForm['Test1'] = 'abc' " )
次のようにマップ全体を選択できます。
def res = clazz.executeQuery("select distinct elements(space.dynForm) from Space as space where space.dynForm['Test1'] = 'abc' " )
しかし、文字列 idx に基づいて特定のインスタンスを取得したいだけです。