我试图使用spring实现一对多的关联,我的模型类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);
}
}
Privillages.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>
我需要从用户中获取用户名,并从Pri村镇获取名称。通过组合,我需要展示。现在我在我的存储库中使用下面的查询,即
@Query("select u from Users ug inner join ug.priviJoin u")
List<Users> findByUsername();
我需要从一个表中选择用户名,从另一个表中选择pname,如上面提到的。我需要如何更改我的查询?
发布于 2017-10-09 12:47:39
您正在经历这个问题有两个原因。
在JPQL中执行联接时,必须确保试图加入的实体之间存在潜在关联。在您的示例中,您缺少了用户与Pri村社entities.In之间的关联,为了创建这个关联,我们必须在User类中添加一个Pri村镇,并建立适当的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;
}
}
Privillages.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")
发布于 2017-10-10 08:05:15
首先,您必须选择是将注释放在字段上还是放在setter上。规范只需要选择一种方式。
您可以省略@Column
注释,这里有默认值,所以现在让我们按如下方式保留它:
@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> privilages;
//getters setters
}
和
@Entity
@Table(name = "privillages")
public class Privillages implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
public String pname;
@ManyToOne(optional = false)
public Users pid;
}
现在您可以创建以下存储库:
public interface UserRepository extends JpaRepository<User, Integer> {
List<User> findAllByUsername(String username);
}
方法findAllByUsername
将返回具有特定用户名的用户列表。
如果您希望坚持使用@Query
,请记住,@Table
注释不会更改@Entity
名称,因此在查询中引用User
而不是Users
。
https://stackoverflow.com/questions/46645747
复制相似问题