一对一关联的spring data jpa表 [英] spring data jpa tables joining by One to one Association
问题描述
我试图通过使用Spring数据JPA一对一关联来联接两个表并显示其结果.在下面,我要添加模型和存储库类, 我的第一个模型类Users是,
I am trying to join two tables and display its result by using spring data JPA one to one association. Below I am Adding my Model and repository classes, My first model class Users is ,
@Entity
@Table(name = "users")
public class Users implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "username")
public String username;
@Column(name = "password")
public String password;
@Column(name = "privid")
public Integer privid;
@OneToOne()
@JoinColumn(name="join_privillage")
private Privillages priviJoin;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getPrivid() {
return privid;
}
public void setPrivid(Integer privid) {
this.privid = privid;
}
public Privillages getPriviJoin() {
return priviJoin;
}
public void setPriviJoin(Privillages priviJoin) {
this.priviJoin = priviJoin;
}
protected Users() {
}
public Users(String username, String password, Integer privid) {
this.username = username;
this.password = password;
this.privid = privid;
}
@Override
public String toString() {
return String.format("Users[id=%d, username='%s', password='%s']", id,
username, password);
}
}
我需要加入的下一个Model类是:
And my next Model class that I need to join is:
@Entity
@Table(name = "privillages")
public class Privillages implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
@Column(name = "privid")
public Integer privid;
@Column(name = "privi_name")
public String privi_name;
@OneToOne(fetch=FetchType.LAZY, mappedBy="priviJoin")
public Users user;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPrivid() {
return privid;
}
public void setPrivid(Integer privid) {
this.privid = privid;
}
public String getPrivi_name() {
return privi_name;
}
public void setPrivi_name(String privi_name) {
this.privi_name = privi_name;
}
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
public Privillages() {
}
public Privillages(Integer privid, String privi_name ) {
this.privid = privid;
this.privi_name = privi_name;
}
}
我的存储库是:
public interface UsersRepository extends CrudRepository<Users, Integer> {
@Query("SELECT u.username FROM Users u inner join p.privi_name FROM
Privillages p")
List<Users> findByUsername();
}
当我运行应用程序时,它的错误如
And when I am running application , its hows the error like
意外令牌:FROM,靠近第1行,第74列[SELECT u.username FROM com.central.model.Users内部连接p.privi_name FROM com.central.model.Privillages p].
"unexpected token: FROM near line 1, column 74 [SELECT u.username FROM com.central.model.Users u inner join p.privi_name FROM com.central.model.Privillages p]".
还有
验证方法公共摘要查询失败 java.util.List com.central.repository.UsersRepository.findByUsername()!".
" Validation failed for query for method public abstract java.util.List com.central.repository.UsersRepository.findByUsername()!".
推荐答案
- 您在查询中使用的是投影,但期望结果是整个实体.
- 同样,您以错误的方式加入数据库并使用数据库列名称而不是映射的字段名称.
- 您两次使用FROM..
如果您希望拥有整个实体,并且已经与用户一起获取了特权,请尝试:
If you want to have the whole entity as a result and the Privilege already fetched along with User, then try:
@Query("SELECT u FROM Users u inner join fetch u.priviJoin")
更新
如果要使用投影,则必须更改结果类型:
if you want to use projection then you have to change the result type:
@Query("SELECT u.username,p.privi_name FROM Users u inner join u.priviJoin p")
List<Object[]> findByUsername();
在这种情况下,您也不需要fetch
.
you also do not need fetch
in that case.
这篇关于一对一关联的spring data jpa表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!