java - 无法映射具有多对多关系的不同实体的字段

标签 java spring-boot jpa

数据库架构 - 2 个表(用户和角色)具有多对多关系,并通过 postgres 中的中间表(user_role)桥接。我想获取所有角色以及创建它的人的名字。名称在用户表中可用,但所有其他详细信息都在角色表中。角色表有一个字段created_by(创建角色的人的User_id)。

我正在尝试构建一个 GET 请求来查看给定 ID 的所有角色以及创建它的人的姓名

实体类Users1.java

@Data
@Entity
@Table(name = "user")
public class Users1 {

@Id
@Column(name = "user_id")
private Long user_id;

@Column(name = "org_id")
private Long org_id;

@Column(name = "boss")
private Boolean boss;

@Column(name = "firstname")
private String firstname;

@Column(name = "created_by")
private Long created_by;


@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_on")
private Date created_on;

@ManyToMany(fetch = FetchType.LAZY,
        cascade = {CascadeType.ALL})
@JoinTable(name = "user_role",
    joinColumns = {@JoinColumn(name = "user_id")},
    inverseJoinColumns = {@JoinColumn(name = "created_by")})

private List<Role> roles = new ArrayList<Role>();

// Getters and Setters

实体类Role.java

@Data
@Entity
@Table(name = "role")
public class Role implements Serializable {
private static final long serialVersionUID = -2343243243242432341L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "role_id")
private Long role_id;

@Column(name = "org_id")
private Long org_id;

@Column(name = "role_name")
private String role_name;

@Column(name = "created_by")
private Long created_by;

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_on")
private Date created_on;

@ManyToMany(fetch = FetchType.LAZY,
        cascade = {CascadeType.ALL},
        mappedBy = "roles")

private List<Users1> users = new ArrayList<>();

// Getters and Setters

roles.repository 类

@Repository
@Transactional
public interface RolesRepository extends CrudRepository<Role,Long> {
    @Query(value ="select r.*,u.firstname as firstname 
    from user u 
    join user_role ur  on u.user_id = ur.user_id 
    join role r on ur.role_id = r.role_id 
    where(true = (select u.boss from user u  where u.user_id = ?2) and r.org_id = ?1)
    or 
    (false = (select u.boss from user u  where u.user_id = ?2) and r.created_by =?2)", 
    nativeQuery=true)

    public Iterable<Role> findAllById(Long org_id,Long created_by );


    @Query("from Users1 u where u.user_id=?2 and u.org_id = ?1")
    public Users1 findUserbyOrgId(Long org_id, Long created_by);

}

roles.Controller 类:

public ResponseEntity<Iterable<Role>> getAllRoles(@RequestParam("org_id") Long org_id, 
@RequestParam("created_by") Long created_by ) throws Exception {

        if( null != rolesRepository.findUserbyOrg(org_id, created_by)) {
            Iterable<Role> Roles = rolesRepository.findAllById(org_id, created_by); }

GET Response from postman:
[
    {
        "roleId": 3,
        "org_id": 2,
        "roleName": "manager",
        "createdBy": 5,
        "createdOn": 1591716178419,
    }
]

我得到了除了名字之外的所有信息。我不知道如何在我的 GET API 中获取它。任何帮助将不胜感激。

最佳答案

不是对您问题的直接回答,但由于以下原因,在实际领域中通常不鼓励@ManyToMany。

  • 连接表可能需要更多信息(但不能)
  • 由于连接表是隐藏的,查询结果很难预测。

推荐的方法是

  • 将两个@ManyToMany类分解为两个@OneToMany类+ 一个 @ManyToOne 类(连接表)
  • 将连接表提升为实体类。

这样的案例在stackoverflow和youtube上有很多实践。我认为改用这种方法最终会节省您更多的时间。

关于java - 无法映射具有多对多关系的不同实体的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62422074/

相关文章:

java - 询问包含数组中包含的字母的单词

Java JADE - 开发共享 SQLite 数据库的多代理应用程序

java - 无法在 Hibernate 中从父级集合中删除分离的子级

java - 无限检查自定义 JSR303 注释

java - 无法找到 XML 模式命名空间的 Spring NamespaceHandler

java - 尝试在 Mac 上安装 Android Studio 时出现“无法安装文件系统”错误

java - 如何检查 java 哈希表是否包含来自另一个哈希表的键值对

java - 如何格式化从rest api生成的json输出

java - 将 spring boot 与 redis 混合

java - Spring-Boot:依赖注入(inject)取决于配置(和使用接口(interface))