【问题标题】:Grails createCriteria many-to-manyGrails createCriteria 多对多
【发布时间】:2011-07-09 00:57:59
【问题描述】:

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

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),其中 it 是超市 ID。这样我就成功了。我的问题是,我不知道如何获取 current'sm 超市 ID。有什么帮助吗?

【问题讨论】:

    标签: grails criteria


    【解决方案1】:
    1. and 应用于 inside 的条件,因此将其应用于单个语句是没有意义的。顶级标准默认为and-ed。
    2. 通常最好不要使用连接器类,只需在域类中使用hasMany: SupermarkethasMany: Product。连接器表将由 Hibernate 自动生成。
    3. 如果您坚持使用 ProductsSupermarket 连接器类,请添加 belongsTo: SupermarketbelongsTo: Product 到它的类,并添加 'hasMany: ProductsSupermarket' 到其他两个,否则您将失去 Grails 的 GORM 优势。
    4. 有一个板块"Querying Associations" in the doc
    5. 对象的id 就是这么简单:mySupermarket.id,或者mySupermarket.ident(),如果关键字段的名称不同。 id 字段默认自动添加到类和表中。

    所以查询是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多