2012-06-19 58 views
0

所以我有域类Grails的搜索列表与“喜欢”

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)搜索与某些字符串账户(如 '%我的帐户%'),类似如下:

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

2)分类账户

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

我知道我可以在域类添加静态映射= {排序帐户名},但如果我想用一个不同的领域,如accountCode进行排序。谢谢,我尝试使用createCriteria,但无法让它工作。

谢谢。

+0

你是如何建立你的标准,出了什么问题? – aiolos

回答

2

感谢您的回答。我无法得到这个工作,但我得到的一个解决方案是在下面,基本上使用正则表达式。

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

(?i)使匹配忽略的情况。

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方法。

+0

当我使用findAllByAccountNameLike Stacktrace时出现以下错误: groovy.lang.MissingMethodException:没有方法的签名:org.hibernate.collection.PersistentSet.findAllByAccountNameLike()适用于参数类型:(org.codehaus.groovy .runtime.GStringImpl)values:[%Alleg%] at com.eveo.nplate.service.AccountService.getAccountsForUser(AccountService.groovy:25) – ibaralf

+0

是在您的域中定义的accountName?如果您键入.findAllBy并等待一秒,它将显示一个上下文菜单,您应该看到以绿色列出的变量。 – Universitas

+0

是的,它是在Domain Class AccountCustomer中定义的。也许这只是作为AccountCustomer.findAllByAccountNameLike ???使用,但不是当它是一个帐户列表? – ibaralf