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

标签 java spring-boot jpa

DB模式-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


role.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);

}


role.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:如何使用 Thread.join

java - 尝试在Windows 10计算机上运行时出现Maven错误

java - 如何使 EntityManager 在 DAO 工厂中正常工作?

使用 2 个字段的 Hibernate 计数问题

java - 泛型外部类的“instanceof”问题

java - 正则表达式积极寻找正则表达式反向匹配的背后?

java - 如何在Linux中未安装jdk的情况下运行JarSigner?

java - 如何获取已应用的 Spring Boot (auto) 配置列表

java - 如何将HandlerInterceptor应用于Spring Boot Actuator端点?

java - 如何在同一个 Hibernate 事务中运行原生 SQL 查询?