如何通过枚举在grails上订购?

时间:2015-10-08 00:12:25

标签: grails gorm

我试图通过枚举来订购,但我在这方面遇到了一些错误...

这是我使用的代码:

 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。

还有其他方法可以通过复杂对象多列对其进行排序吗?

1 个答案:

答案 0 :(得分:0)

您无法按lineType.sortOrder排序,因为GORM / Hibernate按域/实体属性排序。它最终是一个数据库列,但您不能使用sort()指定数据库列。 lineType是域属性,但lineType.sortOrder不是,(它是枚举属性)。按lineType排序将按枚举的序数值排序。这就是你将看到存储在数据库中的内容。

按SQLProjection排序

最复杂的方式(暗示,可能不值得)是为枚举创建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的

您可以在Groovy中对客户端进行排序。

DomainClass.withCriteria {
    and {
          invoiceTicketDetail {
             order('date', 'asc')
             order('code', 'asc')
          }
    }
}.toSorted { it.lineType.sortOrder }