在我正在工作的项目中,数据库的一部分如下图
域类的定义类似于以下内容:
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中是可行的,但它可能会很快变得复杂。
在其他项目中,我使用了类似以下的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)
}
}
}
在这些标准中我已经能够添加自定义过滤器等。但我不知道如何将我的查询(SQL_1)转换为标准。有没有办法用criteriaBuilders完成这个或者我应该坚持使用sql?