【发布时间】:2020-11-17 23:54:18
【问题描述】:
我目前使用 User、Shop 和 Role 之间的 Map 实现了三元关系。 所以在我的用户实体中我有这个映射:
User.java
@Entity
@Table(name = "us_users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private int id;
@Basic(fetch = FetchType.LAZY, optional = false)
private String uuid;
@NotBlank(message = "First name can not be empty")
@Column(name = "usFname")
private String usFname;
@NotBlank(message = "Username can not be left empty")
@Column(name = "us_lname")
private String usLname;
@NotBlank(message = "Email field can not be empty")
@ValidEmail
@Column(name = "usEmail", unique = true)
@Basic(fetch = FetchType.LAZY, optional = false)
private String usEmail;
//this is the actual mapping
//a user can have a list of shops, but one role assigned for each shop
@ManyToMany
@MapKeyJoinColumn(name = "shop_fk")
@JoinTable(name = "user_shop_role",
joinColumns = @JoinColumn(name = "user_fk"), inverseJoinColumns = @JoinColumn(name = "role_fk"))
private Map<Shop, Role> shopRoleMap = new HashMap<>();
//GETTERS AND SETTERS,
}
Role.java
@Entity
@Table(name = "ro_roles")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private int id;
@Column(name = "rn_role_name")
private String roleName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
Shop.java
@Entity
@Table(name = "sh_shops")
public class Shop {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(nullable = false)
private int id;
@NotBlank(message = "Shop name can not be left blank")
private String sh_name;
@NotBlank(message = "please provide shop icon")
private String sh_icon;
@NotBlank(message = "please fill the shop description")
private String sh_description;
@NotBlank
private String sh_tag;
//setters, getters, equals, hashCode methods.
}
此映射为我提供了数据库中另一个具有 user_fk、shop_fk 和 role_fk 的表 (user_shop_role)这很可爱。
困难的一点是使用 Spring Data JPA 进行查询并将结果作为给定用户的 HashMap 获取,如下所示: HashMap
在 UserRepository 层我试过这个:
接口 UserRepository 扩展了 JpaRepository,我有这个查询...
@Query("SELECT u FROM User u join shopRoleMap m where key(m)= usEmail")
public HashMap<Shop, Role> findByUser(String email);
}
如何获取使用地图集合映射的三元关系的结果,以获取商店列表和相应的角色值。更多的是一个键值结果?
【问题讨论】:
-
尝试从 JPA 生成的映射表中获取
Shop和Role的 ID。然后,使用这些 id 获取它们的对象实体并将它们放入您的 HashMap 中。您不能直接查询并将结果添加到 HashMap 中。 -
如果关系映射正确且有效。您是否尝试过“SELECT m FROM ...”而不是“SELECT u FROM”。所以你会以这种方式(m)返回关系,而不是用户对象(u)。
-
@User-Upvotedon'tsayThanks,你不知道什么是三元关系......你不知道用例。恕我直言,你只是在咆哮......
-
@User-Upvotedon'tsay谢谢,请在此处找到我的用例以获取推导映射:[stackoverflow.com/questions/62793067/…
-
@Brother 也不行
标签: java spring-boot jpa spring-data-jpa