2013-11-22 3 views
2

У меня есть объектная модель, которая выглядит следующим образом:PlayFramework 2.x Ebean соответствие запроса manytomany свойство из коллекции

@SuppressWarnings("serial") 
@Entity 
@Table(name = "selections") 
public class Selection extends Model { 

    .... 

    @ManyToMany 
    private Set<Market> markets; 

    .... 
} 

Где Выбор и рынок оба имеют id свойства и методы static Finder<Long, *> find().

И я пытаюсь найти все объекты Selection, которые содержат Market, который находится внутри набора.

@Override @Transactional(readOnly = true) public List<Selection> findSelections(Set<Market> markets) { 

    // Query? 
    return Selection.find().where()...findList(); 
} 

Я знаю, что я могу сделать что-то вроде:

return Selection.find().where().eq("markets.id", market.id).findList(); 

найти единственный объект на рынке - но то, что о нахождении этих объектов из набора? Без повторения множества?

+0

Не задал вопрос. Вы хотите получить единый рынок по id? Или что? – cosmolev

+0

Я пытаюсь найти все элементы выбора, которые имеют отношение manytomany с любым из рынков в наборе, переданным методу. – freeloader

ответ

4
return Selection.find().where().in("markets",markets).findList(); 
+0

Отлично - это работает для поиска выборов, которые имеют ЛЮБОЙ из рынков. – freeloader

+2

Мне интересно, как я получу выбор, имеющий отношения со ВСЕМИ рынками? – freeloader

0

я боролся с той же проблемой, и после прочтения another SO question и the Ebean's Interface Query documentation я вышел с этим:

// Prepare the OQL query string 
String oql = "find selection " + 
    "where markets.id in (:marketList) " + 
    "group by id " + 
    "having count(distinct markets.id) = :marketCount"; 

// Create the query 
Query<Selection> query = Selection.find.setQuery(oql); 

// Set the list of market IDs 
List<Long> marketIds = Arrays.asList(1, 30, 9, 15, 6); 

// Set query parameters (list of market IDs and how many they are) 
query.setParameter("marketList", marketIds); 
query.setParameter("marketCount", marketIds.size()); 

// Get the matching results 
List<Selection> selections = query.findList(); 

Я использую Play 2.4.2 с SBT-играть- ebean версия плагина 2.0.0, обеспечивающая avaje-ebeanorm версия 6.8.1.

Для дополнительной функциональности вы можете быть заинтересованы в чтении this question.

Смежные вопросы