Grails createCriteria多对多

时间:2011-07-09 00:58:00

标签: grails criteria

想象一下,我有以下内容(这是我网站的搜索机制)

class Supermarket {    
String sp_name
String sp_street
}

class Products {
String p_name
String p_price
}

class products_supermarket{
Supermarket sp
Products pro
}

现在我想创建一个标准:

def c = Supermarket.createCriteria()
def results = c.list {
    like("sp_street", params.street)
    and {
        ************ ... params.product
    }
    maxResults(10)

}

我拥有 * 我希望能够在products_supermarket类上找到超级搜索产品。怎么做?

PS。如果条件作为each()方法工作,迭代所有超市,我可以使用if-else语句来搜索产品,如果找到我可以使用: idEq(it) < / strong>,其中是超市ID。这样我就可以做到。我的问题是,我不知道如何获得当前的超市ID。有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

  1. and适用于内部标准,因此没有必要将其应用于单个语句。顶级标准是and - 由defauilt编辑。
  2. 您最好不使用连接器类,只需在域类中使用hasMany: SupermarkethasMany: Product即可。连接器表将由Hibernate自动生成。
  3. 如果您坚持使用ProductsSupermarket连接器类,请将belongsTo: SupermarketbelongsTo: Product添加到其中,并将'hasMany:ProductsSupermarket'添加到其他两个,否则您将失去Grails' GORM优势。
  4. 有一个部分"Querying Associations" in the doc
  5. 对象的id就像那样简单:mySupermarket.idmySupermarket.ident()如果关键字段的命名方式不同。默认情况下,id字段会自动添加到类和表中。
  6. 所以查询是:

    List<Supermarket> results = Supermarket.withCriteria {
        like("sp_street", params.street)
        productSupermarket {
            product {
                idEq(params.product)
            }
            // or just eq('product', someProduct)
        }
        ************ ... params.product
        maxResults(10)
    }