java - Spring Data JPA中的查询语法问题

标签 java spring spring-boot spring-data-jpa

我正在尝试使用 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,如上所述。我需要如何更改我的查询?

最佳答案

您遇到此问题有两个原因。

  1. JPQL 查询无效。
  2. 您尚未在基础 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/

相关文章:

java - 找不到 android.Activity 类 intellij IDEA

java - 从类的完全限定名中获取类

java - JSR-303 验证组定义一个默认组

java - Spring Data Redis - 存储日期时出现问题

java - 如何查找我可以在 intellij 的属性文件中使用的所有属性

java - 在 Eclipse 中运行 Maven/Wicket 项目时的目标是什么?

java - org.apache.commons.net.ftp 使用不同的端口

java - 重定向到创建的实体

java - 分割字符串并实例化对象

java - 使用嵌套 TestConfiguration 覆盖 Spring Boot 2.1 切片测试中的 bean