繁体   English   中英

JPA加入spring boot应用程序

[英]JPA join in spring boot application

我已经阅读了一些例子,但我有个人问题。 我有2张桌子:

Role: id, name User: id, login, name, role_id

角色实体

@Entity
@Table(name = "role")
public class Role {

@Id
@Column(name = "id")
private long id;

@Column(name = "name", length = 45)
private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "role")
private Set<User> user = new HashSet<>();

//getters and setters

用户实体

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id",insertable = false, updatable = false)
private long id;

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

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

@ManyToOne(fetch = FetchType.LAZY)
private Role role;

//getters and setters

和存储库:

public interface UserRepository extends JpaRepository<User, Long> {

String Q_GET_ALL_USERS = "from User u left join Role r on u.role_id=r.id";

@Query(Q_GET_ALL_USERS)
Collection<User> getAllUsers();

此代码显示: Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [from com.example.jpa.model.User u left join Role r on u.role_id=r.id]以下Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [from com.example.jpa.model.User u left join Role r on u.role_id=r.id] Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [from com.example.jpa.model.User u left join Role r on u.role_id=r.id]

我如何理解实体不能包含'id'(在我的情况下在Role )的引用,我应该删除这个字段。 但实体应该有'@Id'。

在这种情况下,我应该在'Role'中创建新列? 或者我可以使用更美丽的决定?

我把所有项目都放到了bb

要在HQL(JPQL)中使用join,您不需要on子句

String Q_GET_ALL_USERS = "select u from User u left join u.role";

由于您没有在where子句中使用role ,因此此查询没有任何意义。

如果要获取具有获取角色的用户,可以使用join fetch

String Q_GET_ALL_USERS = "select u from User u left join fetch u.role";

更新

您的UserRole架构不常用。 我给你的建议做出@ManyToMany从用户关联的角色和删除任何user从关联Role

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

    @ManyToMany(fetch = FetchType.LAZY)
    private Set<Role> roles;

}

@Entity
@Table(name = "role")
public class Role {

    @Id
    @Column(name = "id")
    private long id;

    @Column(name = "name", length = 45)
    private String name;

}

不,您应该在User创建一个新列。

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;

谢谢大家的答案。 正确的实体和下面的查询(加上表架构)。

表(查询)

CREATE TABLE role (
  id   INT         NOT NULL PRIMARY KEY,
  name VARCHAR(45) NOT NULL
);

CREATE TABLE user (
  id        INT         NOT NULL PRIMARY KEY IDENTITY,
  login     VARCHAR(45) NOT NULL,
  user_name VARCHAR(45) NOT NULL,
  role_id   INT         NOT NULL,
  FOREIGN KEY (role_id) REFERENCES role (id)
);

实体:

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id",insertable = false, updatable = false)
private long id;

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

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

@ManyToOne(fetch = FetchType.LAZY)
private Role role;

//getters and setters
}

@Entity
@Table(name = "role")
public class Role {

@Id
@Column(name = "id")
private long id;

@Column(name = "name", length = 45)
private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "role")
private Set<User> user = new HashSet<>();

//getters and setters
}

知识库

public interface UserRepository extends JpaRepository<User, Long> {

String Q_GET_ALL_USERS = "select u from User u left join u.role";

@Query(Q_GET_ALL_USERS)
Collection<User> getAllUsers();
}

@ v-ladynev提出了替代决定(在User仅使用@ManyToMany )。 您可以在此答案的评论中找到更多详细信息。 当我检查这个决定时,我会更新这个答案(我希望我不要忘记它:-))

楷模

@Entity
@Table(name = "sys_std_user")
public class StdUser {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "class_id")
    public int classId;
    @Column(name = "user_name")
    public String userName;
}

@Entity
@Table(name = "sys_std_profile")
public class StdProfile {
    @Id
    @Column(name = "pro_id")
    public int proId;
    @Column(name = "full_name")
    public String fullName;
}

控制器

@PersistenceUnit
private EntityManagerFactory emf;

@GetMapping("/join")
    public List actionJoinTable() {
        EntityManager em = emf.createEntityManager();
        List arr_cust = em
                .createQuery("SELECT u.classId, u.userName, p.fullName FROM StdUser u, StdProfile p WHERE u.classId=p.proId")
                .getResultList();
        return arr_cust;
    }

结果:

[
    [
        1,
        "Ram",
        "Ram Pukar Chaudhary"
    ],
    [
        2,
        "Raja",
        "Raja Kishor Shah"
    ]
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM