findBy多个属性(findAllWhere)

时间:2013-02-13 19:15:20

标签: grails multiple-columns findby

我有一个对象,我必须从中过滤某些属性,其中一些也可能是“null”。我有一个Filter对象和一个Product对象。

在Filter对象中,我有一些反映Product对象的属性,可以填写或留空。这里是关于类的简短视图。

Product: String name, Boolean isEmpty, ...., belongsTo [Producer, Distributor]...


Filter: Boolean isEmpty, ... belongsTo [Producer, Distributor]...

使用此过滤器,我可以搜索具有特定属性的所有产品(空,生产者,分销商)。

我有一个导出功能,我可以选择过滤器,并根据产品的选择输出信息。

由于所有这些属性都可以为null,但也包含一个值,我首先考虑构造一个自己的搜索查询(组合字符串等)来构造一个SQL字符串,然后使用Product.findAll(string_query,string_params) 。但由于这是相当繁琐的,我现在把它改成了这样的东西:

if(filter.producer)
    prods = Product.findAllWhere(producer:filter.producer)
if(filter.distributor)
    prods =  prods.findAll {it.distributor == filter.distributor}
if(filter.isEmpty!=null) //as it could be NULL but also false/true
    prods =  prods.findAll {it.isEmpty == filter.isEmpty}

但是,如果要过滤10-15个属性,这将成为一项相当大的任务。我对Grails或Groovy不太熟悉,但我想这可以更容易解决,对吧?

1 个答案:

答案 0 :(得分:5)

我相信您会发现Grails Criteria查询是完成此类任务的一种非常好的方法。见:

当表示为条件查询时,您的示例可能看起来像这样:

def prods = Product.createCriteria().list {
    if(filter.producer) eq("producer", filter.producer)
    if(filter.distributor)  eq("distributor", filter.distributor)
    if(filter.isEmpty != null) eq("isEmpty", filter.isEmpty)
}