2015-06-16 4 views
1

я следующие объекты:Hibernate - фильтр коллекции детской коллекцией детской

  1. Page Group - содержит страницы.
  2. Страница - ниже группы страниц, имеет роли доступа.
  3. Роль.

Мне нужно запросить все группы страниц, которые разрешены одной (или нескольким) выбранным ролям. Quedied Page Group может содержать не все страницы. Все страницы, заданные для группы страниц, должны иметь выбранные роли.

Как я могу это понять? Думаю, я должен использовать @Filter, но не знаю, как это сделать.

схема базы данных является ниже: enter image description here

Группа страниц листинга:

@Entity 
@Table(name = "PAGE_GROUP") 
public class PageGroup { 

    @Id 
    @Column(name = "pg_id") 
    private long id; 
    @Column(name = "SOME_FIELD") 
    private String field; 
    @OneToMany(mappedBy = "group") 
    private Set<Page> pages; 
} 

Страница листинга:

@Entity 
@Table(name = "page") 
public class Page { 

    @Id 
    @Column(name = "p_id") 
    private long id; 
    @Column(name = "some_field") 
    private String field; 
    @JoinColumn(name = "pg_id") 
    @ManyToOne 
    private PageGroup group; 

    @ManyToMany 
    @JoinTable 
    private Set<Role> roles; 
} 

Роль листинга

@Entity 
@Table(name = "role") 
public class Role { 

    @Id 
    @Column(name = "r_id") 
    private long id; 

    @Column(name = "some_field") 
    private Date field; 
    //important: no Page reference 
} 
+0

Можете ли вы показать код, который вы использовали для _try_ для реализации запроса? – DuncanKinnear

ответ

0

В JPQL можно использовать следующий запрос:

SELECT pg FROM PageGroup pg LEFT JOIN pg.pages p LEFT JOIN p.roles r 
WHERE r.id IN (....<list of Ids you want>....) 

Это будет возвращать список PageGroup объектов, которые имеют страницы, связанные с ролями, определенных данным списком ролей идентификаторов.

+0

1. Нужно добавить «отличное» ключевое слово. Без него возвращаются дубликаты PageGroup. 2. Не работает. Возвращенные PageGroups содержат страницы, которые могут быть выбраны для выбранных ролей. – Gregory

+0

Возвращаемое 'PageGroups должно иметь _тайт минимум одну страницу с указанными ролями. Удостоверьтесь, что вы не ленивы загружаете _все_ страницы, просто глядя на них. На самом деле, если ваши ассоциации получаются ленивыми (они должны быть по умолчанию), тогда запрос должен возвращать только объекты 'PageGroup', ничего не привязанные. Помните, что даже отладчик будет запускать lazy-load, если вы попытаетесь изучить «содержимое» Entity. Не знаю, зачем вам нужны разные, если только вы не используете собственный запрос. – DuncanKinnear

+0

ОК, попробовал аналогичный запрос с нашими данными и, да, вам нужно ключевое слово DISTINCT. Но возвращаемые объекты 'PageGroup 'должны иметь ** ** ** прикрепленные к ним страницы по умолчанию. К сожалению, если вы хотите, чтобы объекты 'PageGroup' содержали только соответствующие объекты' Page', то для этого не существует стандартного метода JPA. Однако Hibernate может это сделать, используя [аннотацию @filter] (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-filters). – DuncanKinnear

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