我正在尝试使用 spring data JPA 实现一对多关联, 我的模型类 Users.java 是,
@Entity
@Table(name = "users")
public class Users implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
public String username;
public String password;
public Integer privid;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "pid")
private Collection<Privillages> priviJoin;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "username")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "password")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name = "privid")
public Integer getPrivid() {
return privid;
}
public void setPrivid(Integer privid) {
this.privid = privid;
}
public Collection<Privillages> getPriviJoin() {
return priviJoin;
}
public void setPriviJoin(Privillages priviJoin) {
this.priviJoin = (Collection<Privillages>) priviJoin;
}
public Users() {
}
@Override
public String toString() {
return String.format("Users[id=%d, username='%s', password='%s']", id,
username, password);
}
}
Privilages.java 是,
@Entity
@Table(name = "privillages")
public class Privillages implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
public String pname;
@ManyToOne(optional = false)
@JoinColumn(name = "pid", referencedColumnName = "privid")
public Users pid;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "pname")
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
@Column(name = "pid")
public Users getPid() {
return pid;
}
public void setPid(Users pid) {
this.pid = pid;
}
public Privillages(){
}
}
我的观点是,
<div th:each= "user: ${joinData}">
<span th:text="${user.pname}">
</span>
<span th:text="${user.username}">
</span>
</div>
我需要从用户中获取用户名,从权限中获取pname。通过组合我需要显示。现在我在我的存储库中使用以下查询,即,
@Query("select u from Users ug inner join ug.priviJoin u")
List<Users> findByUsername();
我需要从一个表中选择用户名,从另一个表中选择 pname,如上所述。我需要如何更改我的查询?
最佳答案
您遇到此问题有两个原因。
- JPQL 查询无效。
- 您尚未在基础 JPQL 查询可以利用的实体之间创建关联。
在 JPQL 中执行联接时,您必须确保尝试联接的实体之间存在底层关联。在您的示例中,您缺少用户和权限实体之间的关联。为了创建此关联,我们必须在用户类中添加权限字段并建立适当的 JPA 映射。我在下面附上了用户的来源。
Users.java
@Entity
@Table(name = "users")
public class Users implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
public String username;
public String password;
public Integer privid;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "pid")
private Collection<Privillages> priviJoin;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@OneToOne()
@JoinColumn(name="pname")
private Privillages privillages;
@Column(name = "username")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "password")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name = "privid")
public Integer getPrivid() {
return privid;
}
public void setPrivid(Integer privid) {
this.privid = privid;
}
public Collection<Privillages> getPriviJoin() {
return priviJoin;
}
public void setPriviJoin(Privillages priviJoin) {
this.priviJoin = (Collection<Privillages>) priviJoin;
}
public Users() {
}
@Override
public String toString() {
return String.format("Users[id=%d, username='%s', password='%s']", id,
username, password);
}
/**
* @return the pvs
*/
public Privillages getPvs() {
return pvs;
}
/**
* @param pvs the pvs to set
*/
public void setPvs(Privillages pvs) {
this.pvs = pvs;
}
}
Privilillages.java
@Entity
@Table(name = "privillages")
public class Privillages implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
@Column(name="pname")
public String pname;
@ManyToOne(optional = false)
@JoinColumn(name = "pid", referencedColumnName = "privid")
public Users pid;
public Integer getId() {
return id;
}
@OneToOne(fetch=FetchType.LAZY, mappedBy="privillages")
private Users user;
public void setId(Integer id) {
this.id = id;
}
@Column(name = "pname")
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
@Column(name = "pid")
public Users getPid() {
return pid;
}
public void setPid(Users pid) {
this.pid = pid;
}
public Privillages(){
}
}
查询:
@Query("select u.username from users u inner join u.privillages pr where pr.pname = :pname")
关于java - Spring Data JPA中的查询语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46645747/