我正在尝试使用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。我需要如何更改我的查询?
首先,您必须选择是将注释放在字段上还是放在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
。
您遇到此问题有两个原因。
在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。这很容易,因为我准备了本机查询。但我深信这种做法是