当前位置: 首页 > 知识库问答 >
问题:

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

昌勇锐
2023-03-14

DBSchema-2表(用户和角色)具有多对多关系,并由postgres中的中间表(用户角色)桥接。我想获取所有角色和创建它的人的姓名。名称在用户表中可用,但所有其他详细信息在角色表中。Roles表中有一个由创建人(创建角色的人的用户id)创建的字段。

我正在尝试构建一个GET请求,以查看给定id的所有角色以及创建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

实体类角色。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

角色。存储库类

@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);

}

角色。控制器类:

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中获取它。任何帮助都将不胜感激。

共有1个答案

阴英武
2023-03-14

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

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

建议的方法

  • 将两个@ManyToMany类分解为两个@OneToMany类一个@manytomone类(联接表)

在stackoverflow和youtube中有很多这样的案例。我认为这将最终为您节省更多的时间来切换到这种方法。

 类似资料:
  • 当我映射同一个实体时,就像这里回答的那样: Hibernate与同一实体的多对多关联 在“tbl_friends”表中,我有相同含义的行。例如,我有id=1的用户和id=2的用户。在“tbl_friends”表中,当他们作为朋友链接时,我有两行 使用Hibernate或JPA引用是否可以在一行(1-2或2-1)中建立这种关系?

  • 当我有用户并且他们有其他用户作为朋友时,我想让应用程序类似于facebook。因此,我创建了一个实体

  • 问题内容: 有一个实体类“ A”。A类可能具有相同类型“ A”的子级。如果“ A”是孩子,则也应保留它的父母。 这可能吗?如果是这样,我应该如何在Entity类中映射关系?[“ A”有一个id列。] 问题答案: 是的,这是可能的。这是标准双向@ManyToOne/ @OneToMany关系的特例。之所以特别是因为关系两端的实体都是相同的。JPA 2.0规范的第2.10.2节详细介绍了一般情况。 这

  • 本文向大家介绍MyBatis中多对多关系的映射和查询,包括了MyBatis中多对多关系的映射和查询的使用技巧和注意事项,需要的朋友参考一下 先说一下需求:  在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别) 创建表:  笔者这里使用中间表连接图书表和图书类别表,图书表中没有使用外键关联图书类别表  而是在中间表中引用了图书主键和类别主键  通

  • 如果在中只有一组,这将非常好地工作。ASSESSMENT_COMMENT只有两列: 它将完美地代表一对多的关系。 现在问题来了: 那么,1)这是Hibernate中已知的bug吗?2)有办法解决这个问题吗?我可以强制Hibernate创建两个映射表,每个映射表一个吗?请记住,我不能更改类来引用(业务逻辑需求)

  • 我正在hibernate的帮助下开发一个电子购物程序。因为我是jsp、servlet、hibernate的新手,我不知道如何使用关系表中的附加列进行多对多关系映射。我已经阅读了几篇教程,但其中大部分都是关于hibernate社区的注释映射和文档,但没有一篇适合我的情况。 我有三个表,分别是电影信息表、订单详情表和订单详情表(关系表),其中订单详情表的结构如下所示。 我正在尝试使用四个POJO类来实