当前位置: 首页 > 知识库问答 >
问题:

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

长孙正卿
2023-03-14

我正在尝试使用spring数据JPA(我的模型类用户)实现一对多关联。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);
}
}

和私人住宅。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>

我需要从用户那里获取用户名,从PriVillage获取pname。通过组合我需要显示。现在我在我的存储库中使用下面的查询,即,

@Query("select u from Users ug inner join ug.priviJoin u")
List<Users> findByUsername();

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

共有2个答案

濮阳耀
2023-03-14

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

您可以省略@Colzo注释,有默认值,所以现在让我们将其保留如下:

@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,而不是User

刘狐若
2023-03-14

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

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

在JPQL中执行连接时,必须确保尝试连接的实体之间存在基础关联。在您的示例中,缺少用户和Privillages实体之间的关联。为了创建这个关联,我们必须在Users类中添加Privillages字段,并建立适当的JPA映射。我已附上以下用户的来源。

用户。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;
        }
    }

私人住宅。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")
 类似资料:
  • 我有3个实体在我的数据库。实体A具有主密钥PK-A,实体B具有主密钥PK-B,实体C具有主密钥PK-C。 实体A与实体B具有1对多关系,实体B与实体C具有1对多关系 我想在Spring Data JPA中基于PK-A(实际上是实体B中的外键)查询实体C。有可能吗? 但这行不通。还有什么建议我可以试试吗?

  • 谁能告诉我@Query注释将支持数据库独立性查询机制 例子: 如果我写这个查询,它会支持所有的数据库,如Mysql、oracle、postgres。 我在spring data jpa参考文档站点中发现了类似的内容 这意味着如果我编写nativeQuery=true,它将被视为本机查询,如果不编写,它将表现为Spring data jpa特定查询,或者它将如何表现请澄清。

  • 我的所有存储库都在扩展commonService存储库,而commonService存储库反过来也在扩展JpaRepository和JpaSpecification 我想在CommonReadRepository中定义原生Sql查询,如:mysql:select*from table limit 1,20; @Query(value=“Select*from?1 limit?2,?3”,nativ

  • 当尝试在Spring data jpa for lpad函数中执行本机查询以获取文本序列时,我遇到了语法错误 Hibernate: select lpad(nextval('finance_accounts_id_seq'): text,8,'0')2022-01-30 09:10:21.102 WARN 16108---[nio-8082-exec-2]o.h.engine.jdbc.spi.S

  • 我一直在mysql中使用Spring data JPA。我主要使用以下查询方法: 但现在,对于一些用例,我想如下所示: 我不明白我怎么能同时使用它们。因为如果我想使用criteria api,我必须创建一个具体的类。如果我创建了一个具体的类,我不明白如何使用jpa查询方法,就好像我实现了接口一样,我必须提供一个实现。 谁能帮我一下吗。

  • 我使用Spring引导和Spring数据JPA。它工作得很好但是!我需要使用复杂的本地查询从Oracle数据库(源数据从SAP ERP)。 假设查询包含5个joned表(一个键或组合键)。我可以使用很多参数。 解决方案: 1)由于耗时,使用JPA为该查询编写新查询是不真实的。创建表之间的所有键关系似乎很复杂。 2)为了运行这些查询,我使用JDBC。这很容易,因为我准备了本机查询。但我深信这种做法是