Grails создают критерии многие ко многим - PullRequest
0 голосов
/ 09 июля 2011

Представьте, что у меня есть следующее (это механизм поиска для моего сайта)

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) , где это идентификатор магазина.Таким образом, я бы сделал это.Моя проблема в том, что я не знаю, как получить текущий идентификатор супермаркета.Любая помощь?

1 Ответ

2 голосов
/ 09 июля 2011
  1. and применяется к критериям внутри , поэтому нет смысла применять его к одному выражению.Критерии верхнего уровня and -ed по умолчанию.
  2. Обычно лучше обходиться без класса соединителя, просто используя hasMany: Supermarket и hasMany: Product в классах домена.Таблица соединителей будет автоматически сгенерирована Hibernate.
  3. Если вы придерживаетесь ProductsSupermarket класса соединителя, добавьте belongsTo: Supermarket и belongsTo: Product к этому классу и добавьте hasMany: ProductsSupermarket к другим двум,или вы теряете преимущество Grails в GORM.
  4. В документе есть раздел "Запрос ассоциаций" .
  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)
}
...