2

次のような動的クエリを作成しようとしています。

def domain = DomainName
def ids = 1
def domainClass = "$domain" as Class
domainClass.find("from ${domain} as m where m.job = ${ids} ").id

しかし、それは機能していません。

私がこれを試している場合、すべて問題ありません:

def domain = DomainName
def ids = 1
DomainName.find("from ${domain} as m where m.job = ${ids} ").id

検索で動的ドメイン クラス名を使用するにはどうすればよいですか?

4

4 に答える 4

9

最も簡単な方法は、次のgetDomainClassメソッドを使用することです。

String domainClassName = 'com.foo.bar.Person'
def ids = 1
def domainClass = grailsApplication.getDomainClass(domainClassName).clazz
domainClass.find("from $domainClassName as m where m.job = ${ids} ").id

ID で単一のインスタンスを取得しようとしている場合は、次を使用することに注意してくださいget

long id = 1234
def person = domainClass.get(id)

複数のインスタンスを取得する必要があり、ID のリストがある場合は、getAll を使用できます。

def ids = [1,2,3,4,5]
def people = domainClass.getAll(ids)

また、プロパティ値が埋め込まれた GStrings を使用するのは本当に悪い考えです - Google の「SQL インジェクション」

たとえば、ユーザー名で人を見つけるには:

String username = 'foo'
def person = domainClass.find(
    "from $domainClassName as m where m.username=:username",
    [username: username])
于 2010-11-20T00:57:14.297 に答える
1

これは、GroovyClassLoader を明示的に使用して行うことができます。

def domain = "DomainName"
def c = new GroovyClassLoader().loadClass(domain)
c.find('...').id
于 2010-11-19T23:39:58.807 に答える
1

Domain クラスを動的に取得する最良の方法は、GrailsApplication オブジェクトを使用することです。例:

import org.codehaus.groovy.grails.commons.ApplicationHolder

def domainName = "full.package.DomainName"
def domainGrailsClass = ApplicationHolder.application.getArtefact("Domain", domainName)
def domainClass = domainGrailsClass.getClazz()
domainClass.find("from ${domainGrailsClass.name} as m where m.job = ${ids}").id

Class.forName()Java と同じように使用することもできます。3 つのパラメータ バージョンを使用して、現在のスレッド コンテキスト クラス ローダーを渡します。

import grails.util.GrailsNameUtils

def domainName = "full.package.DomainName"
def domainClass = Class.forName(domainName, true, Thread.currentThread().getContextClassLoader())
domainClass.find("from ${GrailsNameUtils.getShortName(domainName)} as m where m.job = ${ids}").id

クラスローダーは、Java および JVM フレームワークでは見苦しいトピックです。Grails では、ほとんどの場合、スレッド コンテキスト クラスローダーを使用する必要があります。しかし、GrailsApplication インターフェースを使用して、この問題を完全に回避することをお勧めします。

于 2010-11-20T00:21:28.257 に答える
0

GrailsClassUtilsを使用する

GrailsClassUtils.getShortName(DomainName)

クラスの名前を取得するため、これは機能するはずです...質問を理解していれば

def domainClassName = GrailsClassUtils.getShortName(DomainName)
def ids = 1
DomainName.find("from ${domainClassName} as m where m.job = ${ids} ").id
于 2010-11-19T23:27:48.330 に答える