我试图建立类似于动态查询:

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

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