2013-08-14 1 views
0

Кажется, что мне отвечает here, но я не уверен, чтобы повторить это, поскольку я не слишком хорошо знаком с JPA.Play framework 2: ПРИСОЕДИНЯЙТЕСЬ между моделями в Finder

Моя ситуация включает в себя 3-х классов: Role, User и Pool, описанных следующим образом:

public class Role extends Model { 
    @Id public Long id; 
    public String name; 
    // ... 
} 

public class User extends Model { 
    @Id public Long id; 
    public string displayName; 
    // ... 
    @ManyToMany 
    public List<Role> roles; 
    // ... 
} 

public class Pool extends Model { 
    @Id public Long id; 
    public String name; 
    // ... 
    @ManyToMany 
    public List<Role> roles; 

    public List<User> getMembers() { 
     // ??? 
    } 
} 

(Примечание: там также могут быть наложены ограничения на ресурсы, или разрешения, которые могут быть назначены для пользователей и бассейнов , который может быть использован для фильтрации в .. или вне .. пользователям разрешено в бассейне.)

Я добавил static член

public static final Finder<Long, User> find = new Finder<Long, User>(Long.class, User.class); 

класс Pool (который должен использоваться в методе getPoolMembers), но я не уверен, как получить всех пользователей с пересекающимися группами (и, возможно, с другими ограничениями).

Благодарим за помощь.

+0

Есть ли поле пула для пользователей, чтобы связать эти два, или они связаны каким-то образом через Роли? – 2manyprojects

+0

Да, они разделяют одни и те же роли, но, по сути, я не хочу прямых отношений между «пулом» и «пользователем»; «Пользователь» является частью пула, если он разделяет какую-либо из «роли» –

+0

. Я не уверен, что вы можете настроить Ebean для этого. Я думаю, вам будет лучше выполнять запрос RawSql, поэтому вы можете сами настроить соединение. Я предполагаю, что ваш желаемый запрос будет похож на 'select * from User left join Pool on (User.role = Pool.role) где (Pool.id = $ id)' где $ id - это идентификатор пула, который вы вызываете getPoolMembers метод, справа? У меня нет синтаксиса Ebean RawSql передо мной, но я проверю пример ... – 2manyprojects

ответ

1

Во-первых, я бы переместил ваш поиск в класс User, таким образом User.find возвращает объекты User, а не Pool.find, возвращающие пользователей.

Без прямой связи между пользователями и пулами, чтобы делать выборки из Ebean, я бы предложил использовать SqlQuery (я смешался между SqlQuery и RawSql в своем комментарии к вашему OP: Sql Query позволяет легко параметризовать запросы ; RawSql - для тех случаев, когда запрос исправлен)

Результат SqlQuery - это коллекция SqlRows. Учитывая их, вы можете вернуться к «Пользователи».

Код будет выглядеть примерно так:

List<User> = new ArrayList<User>(); 

SqlQuery query = Ebean.createSqlQuery("select user.id from User left join Pool on (User.role=Pool.role) where (Pool.id=:id)"); // parameter is prefixed by a colon 
query.setParameter("id", this.id); 

List<SqlRow> rows = query.findList(); 
for(SqlRow row : rows){ 
    users.add(User.find.byId(row.getLong("user.id")); // gets the entry from the row for user.id, finds the User corresponding to the id, and then adds the User to the results list 
} 

Это не элегантный, но НТН.

+0

Это хорошее начало! И да, возвращение 'User's из' Pool' немного странно ... Спасибо за этот комментарий. –

+0

Итак, где вы сейчас стоите? Я фактически не создавал проект для тестирования этого кода, но я применил его в аналогичных отношениях в одном из моих проектов и получил ожидаемые результаты. Разве это не дает вам ожидаемых результатов? – 2manyprojects