我试图通过枚举来订购,但我在这方面遇到了一些错误...
这是我使用的代码:
and {
invoiceTicketDetail {
order('date', 'asc')
order('code', 'asc')
}
}
lineType {
order('sortOrder', 'asc')
}
lineType是一个枚举,并且有一个名为sortOrder的int属性,用于正确排序lineType。 问题是,当我尝试执行此操作时,我收到以下错误
No signature of method: InvoiceService.lineType() is applicable for argument types: (InvoiceService$_tt__getInvoiceDetailList_closure36_closure57) values: [InvoiceService$_tt__getInvoiceDetailList_closure36_closure57@3c7c8544]
Possible solutions: asType(java.lang.Class), asType(java.lang.Class). Stacktrace follows:
groovy.lang.MissingMethodException: No signature of method: InvoiceService.lineType() is applicable for argument types: (InvoiceService$_tt__getInvoiceDetailList_closure36_closure57) values: [InvoiceService$_tt__getInvoiceDetailList_closure36_closure57@3c7c8544]
Possible solutions: asType(java.lang.Class), asType(java.lang.Class)
at InvoiceService$_$tt__getInvoiceDetailList_closure36$$EPQTbhPk.doCall(InvoiceService.groovy:477)
InvoiceService是我正在使用的服务,但它不是主要对象。如果我只删除lineType行它可以正常工作,但我需要在此ordenation中添加此lineType。
还有其他方法可以通过复杂对象多列对其进行排序吗?
答案 0 :(得分:0)
您无法按lineType.sortOrder
排序,因为GORM / Hibernate按域/实体属性排序。它最终是一个数据库列,但您不能使用sort()指定数据库列。 lineType
是域属性,但lineType.sortOrder
不是,(它是枚举属性)。按lineType
排序将按枚举的序数值排序。这就是你将看到存储在数据库中的内容。
最复杂的方式(暗示,可能不值得)是为枚举创建Hibernate User Type,以便您可以将排序值存储在单独的数据库列中。使用这样的列,您可以使用SQLProjection动态创建属性并按其排序。这种方法的一个缺点是您将无法返回根实体的实例(例如,SomeDomain.withCriteria()中的SomeDomain)。相反,您可以返回实例ID:
def ids = DomainClass.withCriteria {
and {
invoiceTicketDetail {
order('date', 'asc')
order('code', 'asc')
}
}
projections {
property('id')
sqlProjection 'the_added_column as sortOrder', 'sortOrder', org.hibernate.type.IntegerType as org.hibernate.type.Type
}
sort('sortOrder')
}
您可以直接向域类添加新属性(例如sortOrder)。
您可以在Groovy中对客户端进行排序。
DomainClass.withCriteria {
and {
invoiceTicketDetail {
order('date', 'asc')
order('code', 'asc')
}
}
}.toSorted { it.lineType.sortOrder }