У меня есть следующие объекты. Значит, что Пользователь может принадлежать многим предприятиям и для каждого бизнеса, который может иметь этот пользователь, имеет отдельные разрешения. Таким образом, существующий пользователь может быть назначен другому бизнесу. Таблица 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;
}
Не имеет смысла бросать всю сущность 'BusinessUser' и вместо этого связывать' Authority' с 'Business'? Так или иначе это логично, и ваш «BusinessUser» - это всего лишь синтетическая конструкция между ними. – Kayaman
Я не вижу здесь решения. Как я узнаю, какие власти у одного пользователя в этом бизнесе. Я просто подумал о добавлении еще одного администратора business_user_ и в business_user у меня был бы FK на этой таблице. Затем у меня есть список в таблице BusinessUser, и я могу запросить BusinessUsers и отобразить полномочия оттуда. Может быть, лишний? –
Vaelyr
А, я думаю, ваш объект 'Authority' разделяется пользователями, а не просто простой строкой String. Тогда вам нужна таблица соединений. Запрос JPQL с «SELECT DISTINCT User ...» предоставит вам всех пользователей для бизнеса. – Kayaman