Java 使用一对多关系时Grails withCriteria异常
我有两个域名:Java 使用一对多关系时Grails withCriteria异常,java,grails,groovy,gorm,Java,Grails,Groovy,Gorm,我有两个域名: class JobProcess { static constraints = { scriptUser(blank:false) scriptType() scriptName() scriptPath() scriptArgs(size:0..1000,nullable:true) scriptDateCreated(nullable:true) scriptDateS
class JobProcess {
static constraints = {
scriptUser(blank:false)
scriptType()
scriptName()
scriptPath()
scriptArgs(size:0..1000,nullable:true)
scriptDateCreated(nullable:true)
scriptDateStarted(nullable:true)
scriptDateFinished(nullable:true)
scriptRun()
scriptId()
}
static mapping = {
version false
}
User scriptUser
String scriptType
String scriptName
String scriptPath
String scriptArgs
Date scriptDateCreated
Date scriptDateStarted
Date scriptDateFinished
String scriptRun
int scriptId
}
以及:
此查询:
selected = JobProcess.withCriteria{
like("scriptUser", "%${params.name}%")
maxResults(params.max as int)
firstResult(params.offset? params.offset.toInteger():0)
}
我发现错误:
ERROR property.BasicPropertyAccessor - IllegalArgumentException in class: common.User, getter method of property: id
ERROR errors.GrailsExceptionResolver - java.lang.ClassCastException@503ca729
我还尝试将类似部分替换为:eq(“scriptUser”,1)
但我也会遇到同样的错误
怎么了?有什么想法吗?如果
params.name
是用户的firstName
,请尝试以下操作:
JobProcess.withCriteria {
scriptUser {
like('firstName', "%${params.name}%")
}
maxResults(params.max as int)
firstResult(params.offset ? params.offset.toInteger() : 0)
}
如果params.name
有所不同,您能否澄清您的问题以解释如何使用它
以下是概念验证代码:
// grails-app/domain/JobProcess.groovy
class JobProcess {
User scriptUser
}
// grails-app/domain/User.groovy
class User {
String name
}
// grails-app/conf/Bootstrap.groovy
def init = { servletContext ->
def foo = new User(name: 'foo').save()
def bar = new User(name: 'bar').save()
new JobProcess(scriptUser: foo).save()
new JobProcess(scriptUser: bar).save()
new JobProcess(scriptUser: bar).save()
def result = JobProcess.withCriteria {
scriptUser {
like('name', 'ba%')
}
}
result.each {
println "Result ID: ${it.id}"
}
// prints:
// Result ID: 2
// Result ID: 3
}
这基于“查询关联”部分。我还可以按姓氏和姓氏组合:
selected = JobProcess.withCriteria {
scriptUser {
or {
like('firstName', "%${params.name}%")
like('lastName', "%${params.name}%")
}
}
maxResults(params.max as int)
firstResult(params.offset ? params.offset.toInteger() : 0)
}
有没有直接使用fullName()的方法?您能否澄清什么是params.name
以及如何使用它?是名字吗?姓?两者兼而有之?谢谢,现在我明白我的错误了。我必须按我的用户域进行查询。所以请直呼其名,而不是scriptUser。回答你的问题,我认为没有withCriteria
只是Hibernate的Criteria
的一个抽象,我不确定它是否支持查询瞬态字段。将fullName
作为域的属性可能会更容易。
selected = JobProcess.withCriteria {
scriptUser {
or {
like('firstName', "%${params.name}%")
like('lastName', "%${params.name}%")
}
}
maxResults(params.max as int)
firstResult(params.offset ? params.offset.toInteger() : 0)
}