我尝试构建类似于:
的动态查询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
如何在find?
中使用动态域名类答案 0 :(得分: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 Injection'
例如,按用户名查找某人:
String username = 'foo'
def person = domainClass.find(
"from $domainClassName as m where m.username=:username",
[username: username])
答案 1 :(得分:1)
您应该可以通过显式使用GroovyClassLoader来执行此操作:
def domain = "DomainName"
def c = new GroovyClassLoader().loadClass(domain)
c.find('...').id
答案 2 :(得分: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
您也可以像在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接口并完全避免这个问题。
答案 3 :(得分:0)
GrailsClassUtils.getShortName(DomainName)
获取课程的名称,所以这应该有用......如果我理解了这个问题
def domainClassName = GrailsClassUtils.getShortName(DomainName)
def ids = 1
DomainName.find("from ${domainClassName} as m where m.job = ${ids} ").id