如何在 grails 上按枚举排序?

Posted

技术标签:

【中文标题】如何在 grails 上按枚举排序?【英文标题】:How to order by enum on grails? 【发布时间】:2015-10-08 00:12:25 【问题描述】:

我正在尝试按枚举排序,但我遇到了一些错误...

这是我正在使用的代码:

 and 
      invoiceTicketDetail 
         order('date', 'asc')
         order('code', 'asc')
      

lineType 
   order('sortOrder', 'asc')

lineType 是一个 Enum,并且有一个名为 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】:

您不能按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 中的客户端进行排序。

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

【讨论】:

Emmanuel Rosa,我无法理解第一种方法...我尝试了第三种方法,但没有奏效...第二种方法对我来说是不可能的...模型将出错了,因为 sortOrder 不是该问题的解决方案的一部分...似乎第一个是最好的方法...但是我不明白我应该在添加“the_added_column as sortOrder”的地方使用什么"。 首先你需要创建一个Hibernate User Type来对应lineType枚举。然后在 Grails 中,您可以将表列映射到 lineType:您已有的用于序数,而新的用于排序顺序。然后您可以使用 sqlprojection 中的新列(例如 the_added_column)。基本上,sqlprojection 从添加的列中动态创建一个属性,以便您可以按它排序。 grails.github.io/grails-doc/latest/guide/…

以上是关于如何在 grails 上按枚举排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中的其他 2 个连接表上按日期列排序表?

如何按 Grails 中的多个字段排序?

Groovy/Grails:如何按 id 对对象列表进行排序

Grails:将枚举类型的mysql字段映射到域类

使用 Jooq 在数值基础上按 varchar 字段(具有数值)对查询进行排序

在 Grails 中使用条件对多个字段进行排序