Groovyは動的にクラスを呼び出し、メソッドは仕事をいないことが判明しますか?

StackOverflow https://stackoverflow.com/questions/4230181

質問

私に似た動的なクエリを構築しようとします:

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

どのように検索して、動的ドメインクラス名を使用することができますか?

役に立ちましたか?

解決

最も簡単な方法は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)

また、それが埋め込まれたプロパティ値を使用GStringのにある[本当にの悪いアイデアだ - GoogleのSQLインジェクション '

の例では、ユーザ名によって人を探してます:

String username = 'foo'
def person = domainClass.find(
    "from $domainClassName as m where m.username=:username",
    [username: username])

他のヒント

あなたが明示的にGroovyClassLoaderを使用してこれを行うことができるはずます:

def domain = "DomainName"
def c = new GroovyClassLoader().loadClass(domain)
c.find('...').id

動的ドメインクラスを取得するための最良の方法は、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

また、単にあなたがJavaで同じようClass.forName()を使用することができます。 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インタフェースを使用して、完全に問題を回避することです。

使用 GrailsClassUtilsする

GrailsClassUtils.getShortName(DomainName)
これは動作するはずですので、

、クラスの名前を取得するには...私は質問

を理解している場合
def domainClassName = GrailsClassUtils.getShortName(DomainName)
def ids = 1
DomainName.find("from ${domainClassName} as m where m.job = ${ids} ").id
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top