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
要在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)
更新
您的架构User和Role不常用.我建议你@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)
不,您应该在 中创建一个新列User。
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22107 次 |
| 最近记录: |