首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >spring数据JPA中的查询语法问题

spring数据JPA中的查询语法问题
EN

Stack Overflow用户
提问于 2017-10-09 11:48:34
回答 2查看 244关注 0票数 2

我试图使用spring实现一对多的关联,我的模型类Users.java是,

代码语言:javascript
运行
复制
@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是,

代码语言:javascript
运行
复制
@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(){
} 
}

我的看法是,

代码语言:javascript
运行
复制
<div th:each= "user: ${joinData}">

        <span th:text="${user.pname}">
        </span>
        <span th:text="${user.username}">
        </span>
    </div>

我需要从用户中获取用户名,并从Pri村镇获取名称。通过组合,我需要展示。现在我在我的存储库中使用下面的查询,即

代码语言:javascript
运行
复制
@Query("select u from Users ug inner join ug.priviJoin u")
List<Users> findByUsername();

我需要从一个表中选择用户名,从另一个表中选择pname,如上面提到的。我需要如何更改我的查询?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-09 12:47:39

您正在经历这个问题有两个原因。

  1. JPQL查询无效。
  2. 您还没有在实体之间创建基础JPQL查询可以利用的关联。

在JPQL中执行联接时,必须确保试图加入的实体之间存在潜在关联。在您的示例中,您缺少了用户与Pri村社entities.In之间的关联,为了创建这个关联,我们必须在User类中添加一个Pri村镇,并建立适当的JPA。我已经为用户附上了下面的来源。

Users.java

代码语言:javascript
运行
复制
 @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

代码语言:javascript
运行
复制
@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(){
} 
}

查询:

代码语言:javascript
运行
复制
@Query("select u.username from users u inner join u.privillages pr where pr.pname = :pname")
票数 3
EN

Stack Overflow用户

发布于 2017-10-10 08:05:15

首先,您必须选择是将注释放在字段上还是放在setter上。规范只需要选择一种方式。

您可以省略@Column注释,这里有默认值,所以现在让我们按如下方式保留它:

代码语言:javascript
运行
复制
@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
}

代码语言:javascript
运行
复制
@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;

}

现在您可以创建以下存储库:

代码语言:javascript
运行
复制
public interface UserRepository extends JpaRepository<User, Integer> {

    List<User> findAllByUsername(String username);
}

方法findAllByUsername将返回具有特定用户名的用户列表。

如果您希望坚持使用@Query,请记住,@Table注释不会更改@Entity名称,因此在查询中引用User而不是Users

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46645747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档