如何在 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 个连接表上按日期列排序表?
Groovy/Grails:如何按 id 对对象列表进行排序