2016-04-01 7 views
0

У меня есть два класса домена GORM. Одна карта, и на карте есть много покупок. есть ли способ, которым я могу искать карты, которые имеют больше или равны определенным покупкам. Здесь может быть примеромGrails hasmany поиск точных предметов hasmany

У нас есть 4 карты:

CARD1: оранжевый, оранжевый, яблоко Card2: яблоко, апельсин Card3: оранжевый, оранжевый Card4: яблоко, яблоко, апельсин

Lets скажем, я хотел найти все карты с двумя или более апельсинами. так что только вернет карты 1,3. Наличие поиска основано на имени покупки.

+1

Вы можете сделать это с помощью подзапросов, см. 'DetachedCriteria' в документации – droggo

ответ

0

Если предположить, что классы домена являются чем-то вроде этого ...

class Card { 
    static hasMany = [purchases: Purchase] 
} 

class Purchase { 
    String name 
} 

Вот как вы можете это сделать:

def cards = Card.withCriteria { 
    resultTransformer = org.hibernate.Criteria.DISTINCT_ROOT_ENTITY 

    sizeGe('purchases', 2) 

    purchases { 
     eq('name', 'orange') 
    } 
} 

Вместо того, чтобы использовать подзапрос, вы можете использовать sizeGe(), который подсчитывает количество предметов в коллекции и ищет количество больше или равно количеству предоставленных.

Однако добавление eq() к запросу заставляет результат содержать дубликаты из-за группировки. Побочный эффект побочного запроса не будет. Таким образом, трансформатор результатов DISTICT_ROOT_ENTITY отфильтровывает дубликаты после факта.

Вы можете узнать больше о критериях запросов из моих статей here.

+0

На самом деле это выглядит так, что требуется только одна покупка, чтобы быть оранжевой. Есть ли способ, который я могу сказать, по крайней мере, два из них оранжевые? – moloch101

+0

Да, это гораздо более сложная проблема. Я несколько раз отвечал на этот вопрос. Я думаю, что это лучшее решение, которое я нашел до сих пор: http://stackoverflow.com/questions/32856121/grails-how-to-best-construct-a-hibernate-criteria-builder-to-search-hasmany/32872048 # 32872048 –

+0

Awesome. Это работало для получения нескольких покупок, но у меня все еще есть одна проблема. Я пытаюсь использовать executeQuery дважды, затем обнаруживаю пересечение двух наборов, чтобы пользователи могли указывать несколько покупок, но когда я пытаюсь выполнить executeQuery дважды, он возвращает первый поиск, когда я его повторю второй раз. Любая идея, что происходит? – moloch101