带有'喜欢'的Grails搜索列表

时间:2012-06-19 19:36:17

标签: grails gorm

所以我有域类

class SalesRep {
   SalesTerritory territory
}
class SalesTerritory {
   hasMany=[accounts: AccountCustomer]
   String territoryCode
}

class AccountCustomer {
   String accountName
   String accountCode
   belongsTo = SalesTerritory
   hasMany=[salesTerritories: SalesTerritory]
}

在控制器中,我可以通过以下方式获取帐户:

def salesRep = SalesRep.findBy... // 
def accounts = salesRep.territory.accounts

我想做两件事:

1)搜索包含某些字符串的帐户(例如'%My Account%'),如下所示:

def accounts = salesRep.territory.accounts.find("accountName like '%My Account%'")

2)对帐户进行排序

def accounts = salesRep.territory.accounts.sort("accountName")

我知道我可以在域类中添加静态映射= {sort accountName},但如果我想使用其他字段(如accountCode)进行排序,该怎么办?谢谢,我尝试使用createCriteria,但无法让它工作。

感谢。

2 个答案:

答案 0 :(得分:2)

感谢您的回答。我无法让它工作,但我开始工作的一个解决方案如下,基本上使用正则表达式。

def myAccount = "My Account"
accounts = salesRep.territory.accounts.findAll {
   it.accountName ==~ /(?i).*${myAccount}.*/
}

(?i)使匹配忽略大小。

答案 1 :(得分:1)

尝试

def accounts = salesRep.territory.accounts.findAllByAccountNameLike("%${MyAccount}%")

喜欢区分大小写,但如果要忽略大小写,请使用iLike。

对于排序,您可以使用

def accounts = salesRep.territory.accounts.list(sort:'accountName', order:'asc')

您还可以通过静态映射

在域类中定义排序
static mapping = {
     sort accountName:"asc"
}  

但我想如果你想按照你的方式排序,你需要添加一个比较器,并确保你的类实现Comparable。

class YourClassName implements Comparable{

 String accountName
 ...


 @Override
 public int compareTo(Object o) {
     if (o == null || this == null) {
         return 0;
     } else {
         return value.compareTo(o.value)
     }
 }
}

然后,当您调用.sort时,它将使用您域中的compareTo方法。