java - 谁能帮我写一个更新查询

标签 java mysql spring hibernate hql

我在项目中使用 Hibernate 和 Spring,我想编写一个 HQL 查询来获取更新用户的角色。我怎样才能做到这一点

这是我的 ERD:

enter image description here

这是我的java类: 用户

@Entity
@Table(name = "users")
public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "userId")
    private int userId;

    @Column(name = "userIdCardNo")
    private String useridcardno;

    @Column(name = "userFname")
    private String fname;

    @Column(name = "userMname")
    private String mname;

    @Column(name = "userLname")
    private String lname;

    @Column(name = "userPhone")
    private int phone;

    @Column(name = "userPhone2")
    private String phone2;

    @Column(name = "userAddress")
    private String address;

    @Column(name = "userAddress2")
    private String address2;

    @Column(name = "userName")
    private String username;

    @Column(name = "userPass")
    private String password;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "userId", nullable = false) , inverseJoinColumns = @JoinColumn(name = "roleId", nullable = false) )
    private List<Role> roles;

    @Enumerated(EnumType.STRING)
    @Column(name = "userStatus")
    private UserStatus status;



    //CREATE MD5 from String
    public static String md5(String input) {
        String md5 = null;
        if (null == input)
            return null;
        try {
            // Create MessageDigest object for MD5
            MessageDigest digest = MessageDigest.getInstance("MD5");
            // Update input string in message digest
            digest.update(input.getBytes(), 0, input.length());
            // Converts message digest value in base 16 (hex)
            md5 = new BigInteger(1, digest.digest()).toString(16);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return md5;
    }

    //CONTRUSCTORS
    public User() {
    }


    public User(int userId, String useridcardno, String fname, String mname, String lname, int phone, String phone2,
            String address, String address2, String username, String password, List<Role> roles, UserStatus status) {
        super();
        this.userId = userId;
        this.useridcardno = useridcardno;
        this.fname = fname;
        this.mname = mname;
        this.lname = lname;
        this.phone = phone;
        this.phone2 = phone2;
        this.address = address;
        this.address2 = address2;
        this.username = username;
        this.password = BCrypt.hashpw(password, BCrypt.gensalt());
        this.roles = roles;
        this.status = status;
    }

    //GETTERS and SETTERS
    public int getUserId() {
        return userId;
    }


    public void setUserId(int userId) {
        this.userId = userId;
    }


    public String getUseridcardno() {
        return useridcardno;
    }


    public void setUseridcardno(String useridcardno) {
        this.useridcardno = useridcardno;
    }


    public String getFname() {
        return fname;
    }


    public void setFname(String fname) {
        this.fname = fname;
    }


    public String getMname() {
        return mname;
    }


    public void setMname(String mname) {
        this.mname = mname;
    }


    public String getLname() {
        return lname;
    }


    public void setLname(String lname) {
        this.lname = lname;
    }


    public int getPhone() {
        return phone;
    }


    public void setPhone(int phone) {
        this.phone = phone;
    }


    public String getPhone2() {
        return phone2;
    }


    public void setPhone2(String phone2) {
        this.phone2 = phone2;
    }


    public String getAddress() {
        return address;
    }


    public void setAddress(String address) {
        this.address = address;
    }


    public String getAddress2() {
        return address2;
    }


    public void setAddress2(String address2) {
        this.address2 = address2;
    }


    public String getUsername() {
        return username;
    }


    public void setUsername(String username) {
        this.username = username;
    }


    public String getPassword() {
        return password;
    }


    public void setPassword(String password) {
        this.password = password;
    }


    public List<Role> getRoles() {
        return roles;
    }


    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }


    public UserStatus getStatus() {
        return status;
    }


    public void setStatus(UserStatus status) {
        this.status = status;
    }
}

角色

@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "roleId")
    private int id;

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

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "roles")
    private List<User> users;

    public Role() {

    }

    public Role(int id, String roleName, List<User> users) {
        super();
        this.id = id;
        this.roleName = roleName;
        this.users = users;
    }

    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;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

}

用户角色

@Entity
@Table(name="users_roles")
public class UsersRoles {
    @Id
    @Column(name="userId")
    private int userId;

    @Id
    @Column(name="roleId")
    private int roleId;

    public UsersRoles() {

    }

    public UsersRoles(int userId, int roleId) {
        super();
        this.userId = userId;
        this.roleId = roleId;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }
}

我对数据库查询很陌生,因为我只尝试过几次。我可以获取一张表中的数据,但是对于连接这样的表,我确实需要提示。

最佳答案

只需加载用户并修改角色列表中的项目。然后提交事务。 - 就这样。

EntityManager em ...
...
<begin Transaction>
...
User user = em.find(User.class, 1); //load by id 1 - just for example
User role1 = em.find(Role.class, 1); //load by id 1 - just for example

user.getRoles().add(role1);
...
<commit Transaction>

它是如此简单,因为您使用 ORM(对象关系映射器)(Hibernate)。我几乎在所有情况下都不需要编写更新查询,而是保留对象的状态。

关于java - 谁能帮我写一个更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33095966/

相关文章:

mysql - 仅从 MySQL 数据库导出事件

spring - 与普通 Autowiring 或属性 Autowiring 相比,构造函数 Autowiring 有什么优势?

java list<map> 具有重复值

java - 将 TOML 配置字段传递给 Spring KafkaListener 注解

java - 将 GWT 添加到现有的 Maven Web 应用程序

java - 在不创建事务实例的情况下使用 hibernate 在数据库中进行插入

c++ boost::archives和mySql BLOB,反序列化错误

sql - mysql 分组依据

java - Spring autowire byName 没有按预期工作

java - 有没有办法获取通过@Autowired注入(inject)的具有范围原型(prototype)的所有bean?