2015-07-08 6 views
0

У меня есть следующие объекты. Значит, что Пользователь может принадлежать многим предприятиям и для каждого бизнеса, который может иметь этот пользователь, имеет отдельные разрешения. Таким образом, существующий пользователь может быть назначен другому бизнесу. Таблица Business_User выглядит следующим образом:JPA Query from 3 column join table

 
USER_ID BUSINESS_ID AUTHORITY_NAME 
6   1    ROLE_ANALYTICS 
6   1    ROLE_SELF_ANALYTICS 
7   1    ROLE_REVIEWS 
8   1    ROLE_ANALYTICS 
8   1    ROLE_SELF_ANALYTICS 
8   1    ROLE_REVIEWS 
6   2    ROLE_REVIEWS 
6   2    ROLE_SELF_ANALYTICS 

Вопрос: Я запрашивая пользователей для одного бизнеса, пытаясь создать список пользовательских объектов DTO, что DTO выставляет List<Authority>, проблема в том, что я не могу понять, как следует Я получаю эти полномочия для каждого пользователя из таблицы Business_User. Старался делать причудливые вещи с лямбдами, но им не повезло. Я использую Spring Data для запросов, возможно, может решить проблему в репозитории.

Заранее спасибо.

EDIT: Если бы я пойти другой маршрут, добавив новый присоединиться к таблице BUSINESS_USER_AUTHORITY, как бы я должен описать его в UserBusiness классе? Я также хотел бы, чтобы первичный ключ был выше user_id и business_id. Обратите внимание, что name является ПК в таблице Authority.

Что-то вроде этого, но это не создает меня для соединения таблицы вообще.

Изменить UserBusiness класс:

@ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
     name = "BUSINESS_USER_AUTHORITY", 
     joinColumns = {@JoinColumn(name = "business_user_id", referencedColumnName = "id")}, 
     inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")}) 
    private Set<Authority> authorities = new HashSet<>(); 

Пользователь

@Entity 
@Table(name = "USER") 
public class User extends AbstractAuditingEntity implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumns({ 
    @JoinColumn(name = "user_id", referencedColumnName = "id") 
    }) 
    private Set<BusinessUser> businessUsers = new HashSet<>(); 
} 

BusinessUser

@Entity 
@Table(name = "BUSINESS_USER") 
@IdClass(BusinessUser.class) 
public class BusinessUser implements Serializable { 

    @Id 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @Id 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "business_id") 
    private Business business; 

    @Id 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "authority_name") 
    private Authority authority; 

} 

Бизнес

@Entity 
@Table(name = "BUSINESS") 
public class Business implements Serializable { 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumns({ 
    @JoinColumn(name = "business_id", referencedColumnName = "id") 
    }) 
    private Set<BusinessUser> businessUsers = new HashSet<>(); 

} 

Authority

@Entity 
@Table(name = "AUTHORITY") 
public class Authority implements Serializable { 

    @NotNull 
    @Size(min = 0, max = 50) 
    @Id 
    @Column(length = 50) 
    private String name; 
} 
+0

Не имеет смысла бросать всю сущность 'BusinessUser' и вместо этого связывать' Authority' с 'Business'? Так или иначе это логично, и ваш «BusinessUser» - это всего лишь синтетическая конструкция между ними. – Kayaman

+0

Я не вижу здесь решения. Как я узнаю, какие власти у одного пользователя в этом бизнесе. Я просто подумал о добавлении еще одного администратора business_user_ и в business_user у меня был бы FK на этой таблице. Затем у меня есть список в таблице BusinessUser, и я могу запросить BusinessUsers и отобразить полномочия оттуда. Может быть, лишний? – Vaelyr

+0

А, я думаю, ваш объект 'Authority' разделяется пользователями, а не просто простой строкой String. Тогда вам нужна таблица соединений. Запрос JPQL с «SELECT DISTINCT User ...» предоставит вам всех пользователей для бизнеса. – Kayaman

ответ

0

Я закончил тем, что писал такую ​​функцию, но если кто-нибудь имеет решение, как бы дизайн взгляд с другой присоединиться к таблице между BusinessUser < -> BusinessUserAuthority, тогда я был бы рад ее реализовать.

private Function<Map.Entry<User, List<BusinessUser>>, UserManagementDTO> getPermissionForUser() { 
    return user -> { 
     UserManagementDTO dto = userManagementMapper.userToUserManagementDTO(user.getKey()); 
     dto.setAuthorities(user.getValue().stream().map(BusinessUser::getAuthority).collect(Collectors.toSet())); 
     return dto; 
    }; 
    }