Критерии самоссылки Grails

В проекте, над которым я работаю, есть часть базы данных, подобная следующей диаграмме

Раздел базы данных

Классы домена имеют определение, подобное следующему:

class File{
    String name
}

class Document{
    File file
}

class LogEntry{
    Document document
    Date date
}

Сначала мне нужно получить только самую последнюю версию LogEntry для всех документов; в SQL я делаю следующее (SQL_1):

SELECT t1.* FROM log_entry AS t1 
LEFT OUTER JOIN log_entry t2 
on t1.document_id = t2.document_id AND t1.date < t2.date 
WHERE t2.date IS NULL

Тогда в моем сервисе у меня есть такая функция:

List<LogEntry> logs(){
    LogEntry.withSession {Session session ->
        def query =  session.createSQLQuery(
                """SELECT t1.* FROM log_entry AS t1 
                    LEFT OUTER JOIN log_entry t2 
                    on t1.document_id = t2.document_id AND t1.date < t2.date 
                    WHERE t2.date IS NULL"""
        )
        def results = query.with {
            addEntity(LogEntry)
            list()
        }
        return results
    }
}

SQL-запрос действительно решает мою проблему, по крайней мере, в некотором роде. Мне также нужно разбить на страницы, отфильтровать и отсортировать результаты, а также объединить таблицы LogEntry, Document и File. Хотя в SQL это выполнимо, оно может довольно быстро усложниться.

В другом проекте я использовал критерии запроса, аналогичные следующим:

Criteria criteria = LogEntry.createCriteria()
criteria.list(params){ //Max, Offset, Sort, Order
    fetchMode 'document', FetchMode.JOIN //THE JOIN PART
    fetchMode 'document.file', FetchMode.JOIN //THE JOIN PART

    createAlias("document","_document") //Alias could be an option but I would need to add transients, since it seems to need an association path, and even then I am not so sure

    if(params.filter){ //Filters
        if(params.filter.name){
            eq('name', filter.name)
        }
    }
}

В такие критерии я смог добавить пользовательские фильтры и т. Д. Но я понятия не имею, как перевести мой запрос (SQL_1) в критерии. Есть ли способ сделать это с помощью критерия Builders или я должен придерживаться sql?

0 ответов

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