【问题标题】:spring data jpa tables joining by One to one Associationspring data jpa表通过一对一关联加入
【发布时间】:2018-03-15 19:14:22
【问题描述】:

我正在尝试通过使用 spring data JPA 一对一关联来连接两个表并显示其结果。下面我添加我的模型和存储库类, 我的第一个模型类用户是,

@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);
}
}

我需要加入的下一个模型课程是:

@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();
}

当我运行应用程序时,它的错误是怎样的

"意外令牌:FROM 靠近第 1 行,第 74 列 [SELECT u.username FROM com.central.model.Users u 内部加入 p.privi_name FROM com.central.model.Privilages p]"。

还有

" 方法公共摘要的查询验证失败 java.util.List com.central.repository.UsersRepository.findByUsername()!”。

【问题讨论】:

    标签: java spring jpa spring-data-jpa


    【解决方案1】:
    • 您正在查询中使用投影,但希望得到一个完整的实体。
    • 另外,您以错误的方式加入并使用数据库列名而不是映射的字段名。
    • 您使用 FROM 两次..

    如果您希望获得整个实体作为结果,并且权限已经与用户一起获取,请尝试:

    @Query("SELECT u FROM Users u inner join fetch u.priviJoin")
    

    更新

    如果你想使用投影,那么你必须改变结果类型:

    @Query("SELECT u.username,p.privi_name FROM Users u inner join u.priviJoin p")
    List<Object[]> findByUsername();
    

    在这种情况下,您也不需要fetch

    【讨论】:

    • 我正在使用这个以 id 作为条件的查询。显示用户名和 priv_name。我现在更改了这样的查询。"@Query("SELECT u.username,p.privi_name FROM Users u inner join Privilages p ON u.id=p.id")"。但仍然显示错误“预期加入的路径! "。
    • 我的外键约束也在两个表的 privid 上。
    • 我需要通过 privid 的条件从两个表中获取记录。那么我需要遵循哪些步骤来使用一对一关联获取这些映射?
    • 您只需将 where 语句添加到上述任何内容。两者都可以根据您的最终需求工作
    • 好的,谢谢你的回复先生。我会试试的。
    猜你喜欢
    • 2016-07-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2015-04-25
    相关资源
    最近更新 更多