Grails findBy принадлежит, чтобы дать JdbcSQLException

Скажем, для системы у меня были объекты Student и User, например:

User { 
}

Student {
    User user //not nullable
    static belongsTo = [User]
}
Teacher {
    static belongsTo = [user:User]
}

У меня есть много кода, написанного для этих моделей, и много динамического поиска в нем

def u1 = new User().save( flush: true)
new Student( user: u1 ).save( flush: true)
...

def s = Student.findByUser( springSecurityService.currentUser)
//s can be null
def t = Teacher.findByUser( springSecurityService.currentUser)
//t can be null
if( s != null)
    //do something with 's'
if( t != null)
    //do something with 't'
...

И все это работало нормально. Но я хотел обновить модель своего домена, чтобы добавить каскадный доступ от пользователя к студенту. Так я и сделал:

User {
  Student student //nullable
}

И я хотел бы сохранить пользователя, как это:

new User( student: new Student() ).save( flush: true)

Но проблема в том, что, когда я пытаюсь получить доступ к 's', как я делал выше.

Если Student.findByUser может найти одного такого студента, то он работает.
Но если он должен вернуть ноль, он выдаст ошибку.

def s = Student.findByUser( springSecurityService.currentUser)   

приведет к:

org.h2.jdbc.JdbcSQLException                                                    

Parameter #2 is not set; SQL statement:

select this_.id as id18_0_, this_.version as version18_0_, from student this_ where this_.id=? limit ? [90012-173]

Я знаю, что могу получить доступ к объекту студента через пользовательский объект, такой как user.student, но я бы хотел сохранить существующий код таким, какой он есть.

Я видел эту ветку, и у нее была похожая проблема, но нет разрешения.


Это ошибка? Что я могу сделать, чтобы обойти это? Я не настраиваю свои доменные модели должным образом?

Спасибо

1 ответ

В качестве альтернативы, вы можете попробовать что-то вроде этого, используя hasOne вместо belongsTo,

class User {
    static hasOne = [student:Student, teacher:Teacher]
    static constraints = {
        student unique:true, nullable: true
        teacher unique:true, nullable: true
    }
}

class Student {
    User user
}

class Teacher {
    User user
}

Это все еще каскады и, кажется, прекрасно обрабатывает нулевые поиски.

Другие вопросы по тегам