Grails自我引用标准

Oma*_*fer 6 self-join grails-orm grails3

在我正在工作的项目中,数据库的一部分如下图所示

数据库部分

域类具有类似于以下的定义:

class File{
    String name
}

class Document{
    File file
}

class LogEntry{
    Document document
    Date date
}
Run Code Online (Sandbox Code Playgroud)

首先,我需要获取所有文档的最新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
Run Code Online (Sandbox Code Playgroud)

然后在我的服务中我有这样的功能:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

SQL查询确实解决了我的问题,至少在某种程度上.我还需要对结果进行分页,过滤和排序,以及连接表LogEntry,Document和File.尽管它在SQL中是可行的,但它可能会很快变得复杂.

在其他项目中我使用了类似于以下的criteriaQuery:

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这些标准中,我已经能够添加自定义过滤器等.但我不知道如何将我的查询(SQL_1)转换为标准.有没有办法用criteriaBuilders完成这个或者我应该坚持使用sql?