сортировать по обнуляемому свойству в отношении n: 1 - PullRequest
0 голосов
/ 04 октября 2011

У меня следующая проблема - учитывая только фрагмент всей доменной среды, я попытаюсь объяснить это:

У меня есть эти два класса предметной области, и я хочу получить список исследований и отсортировать их по имени своего (текущего) врача. Моя проблема в том, что я не знаю, как выполнить запрос критериев с помощью gorm ...

class Study {    
    Date studydate
    String comment
    static belongsTo = [currentPatient:Patient, originalPatient: Patient, originalPhysician: Physician, currentPhysician: Physician]

    static mapping = {
        columns{
            currentPatient column:'id_patient_current'
            originalPatient column:'id_patient'
            originalPhysician column:'id_physician'
            currentPhysician column:'id_physician_current'
        }
    }
}

class Physician {
    String personname

    static hasMany = [currentStudies: Study, originalStudies: Study]

    static mappedBy = [currentStudies:  'currentPhysician',
                       originalStudies: 'originalPhysician']
}

и теперь запрос:

def physician = Physician.get(params?.phId)

def studies = Study.withCriteria{
    and{
        maxResults(limit as Integer)
        firstResult(offset as Integer)

        currentPhysician{
            if(physician){
                eq('id', physician.id)
            }    
            order('personname', 'asc')
        }
    }
}

проблема в том, что не в каждом исследовании должен быть врач - возможно, что столбцы (в базе данных) - "id_physician" и "id_physician_current" - содержат значения NULL (пациент не пришел от врача).

через прямой sql запрос не проблема:

select st.id, ph.personname  from study as st left join Physician as ph on ph.ID = st.ID_Physician_Current order by ph.PersonName

Я использую Grails 1.3.7 в базе данных mssql

1 Ответ

0 голосов
/ 04 октября 2011

Я считаю, что следующий запрос выполняет то, что вы просите.

def studies = Study.withCriteria{
    maxResults(limit as Integer)
    firstResult(offset as Integer)
    order('currentPhysician.personname', 'asc')

    if(physician) {
        or {
            eq('currentPhysician', physician)
            isNull('currentPhysician')
        }
    }

    order('currentPhysician.personname', 'asc')
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...