Grails с критерием исключения при использовании отношения один ко многим - PullRequest
0 голосов
/ 24 августа 2010

У меня есть 2 домена:

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
}

и:

class User {

  static hasMany = [ jobs : JobProcess ]

    static constraints = {
        login(unique: true, blank: false)
        password(password: true, blank: false)
        email(blank: false, emailAddr: true, maxSize: 50)
        firstName(blank:false, maxSize:32)
        lastName(blank:false, maxSize:32)
        phoneNo(nullable: true)
    }

    static mapping = {
        sort lastName: 'asc'
    }

    String login
    String firstName
    String lastName
    String phoneNo
    String email
    String password

    boolean locked = false

    String toString()
    {
        if (firstName == "")
            return email
        return fullName()
    }

    String fullName()
    {
        return firstName + " " + lastName
    }
}

И этот запрос:

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), но я получаю те же ошибки.

Что не так?Есть идеи?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Если params.name является User 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
 }

Это основано на разделе «Запрос ассоциаций» здесь .

0 голосов
/ 24 августа 2010

Я также могу объединить по firstName и lastName:

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 ()?

...