Groovy的动态调用的类和方法找不工作?
-
26-09-2019 - |
题
我试图建立类似于动态查询:
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的财产价值嵌入式 - 谷歌“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
您还可以使用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接口和完全避免这个问题。
GrailsClassUtils.getShortName(DomainName)
要获取类的名字,所以这应该工作...如果我理解这个问题。
def domainClassName = GrailsClassUtils.getShortName(DomainName)
def ids = 1
DomainName.find("from ${domainClassName} as m where m.job = ${ids} ").id
不隶属于 StackOverflow