JPA加入spring boot应用程序

qiz*_*zer 5 java spring hibernate jpa join

我已经阅读了一些例子,但我有个人问题.我有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
Run Code Online (Sandbox Code Playgroud)

用户实体

@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
Run Code Online (Sandbox Code Playgroud)

和存储库:

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();
Run Code Online (Sandbox Code Playgroud)

此代码显示: 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

v.l*_*nev 8

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

String Q_GET_ALL_USERS = "select u from User u left join u.role";
Run Code Online (Sandbox Code Playgroud)

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

如果您希望获得具有获取角色的用户,则可以使用 join fetch

String Q_GET_ALL_USERS = "select u from User u left join fetch u.role";
Run Code Online (Sandbox Code Playgroud)

更新

您的架构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;

}
Run Code Online (Sandbox Code Playgroud)


Rom*_*n C 4

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;
Run Code Online (Sandbox Code Playgroud)