Groovy动态调用类和find方法不起作用?

Fab*_*ier 2 grails groovy grails-orm groovyclassloader

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

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

但它不起作用.

如果我正在尝试这个,一切都很好:

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

如何在find中使用动态域名类?

Bur*_*ith 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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您尝试按ID获取单个实例,请使用get:

long id = 1234
def person = domainClass.get(id)
Run Code Online (Sandbox Code Playgroud)

如果你想获得多个实例并且你有一个id列表,你可以使用getAll

def ids = [1,2,3,4,5]
def people = domainClass.getAll(ids)
Run Code Online (Sandbox Code Playgroud)

此外,它是一个真正坏主意,使用与属性值嵌入GString的-谷歌"SQL注入"

例如,通过用户名查找人员:

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