我想使用带有注释@Query的Jpa存储库进行Join查询。
我有两个表:
table user
with iduser,user_name
和:
table area
with idarea, area_name and iduser
本机查询是:
SELECT
u.user_name
FROM
user as u
INNER JOIN area as a ON a.iduser = u.iduser
WHERE
a.idarea = 4
现在我有一个表休眠实体用户和区域
所以我尝试了UserRespository
@Query(SELECT u.userName FROM User u
INNER JOIN Area a ON a.idUser = u.idUser
WHERE
a.idArea = :idArea)
List<User> findByIdarea(@Param("idArea") Long idArea);
日志说:
意外的标记:
有什么主意吗?
我的表实体
#User Table
@Entity
@Table(name="user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Long idUser;
private String userName;
@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="iduser")
public Long getIdUser() {
return idUser;
}
public void setIdUser(Long idUser) {
this.idUser = idUser;
}
@Column(name="user_name")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
#AREA table
@Entity
@Table(name="area")
public class Area implements Serializable {
private static final long serialVersionUID = 1L;
private Long idArea;
private String areaName;
private Long idUser;
@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="idarea")
public Long getIdArea() {
return idArea;
}
public void setIdArea(Long idArea) {
this.idArea = idArea;
}
@Column(name="area_name")
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
@Column(name="iduser")
public Long getIdUser() {
return idUser;
}
public void setIdUser(Long idUser) {
this.idUser = idUser;
}
}
您遇到此问题的原因有两个。
在JPQL中执行联接时,必须确保尝试联接的实体之间存在基础关联。在您的示例中,您缺少User和Area实体之间的关联。为了创建此关联,我们必须在User类内添加Area字段并建立适当的JPA
Mapping。我已在下面附加了User的来源。(请注意,我已将映射移至字段)
User.java
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="iduser")
private Long idUser;
@Column(name="user_name")
private String userName;
@OneToOne()
@JoinColumn(name="idarea")
private Area area;
public Long getIdUser() {
return idUser;
}
public void setIdUser(Long idUser) {
this.idUser = idUser;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Area getArea() {
return area;
}
public void setArea(Area area) {
this.area = area;
}
}
一旦建立了这种关系,就可以在@Query声明中引用area对象。@Query批注中指定的查询必须遵循正确的语法,这意味着您应省略on子句。请参阅以下内容:
@Query("select u.userName from User u inner join u.area ar where ar.idArea = :idArea")
在查看您的问题时,我还使用户和区域实体之间的关系成为双向的。这是Area实体建立双向关系的来源。
Area.java
@Entity
@Table(name = "area")
public class Area {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="idarea")
private Long idArea;
@Column(name="area_name")
private String areaName;
@OneToOne(fetch=FetchType.LAZY, mappedBy="area")
private User user;
public Long getIdArea() {
return idArea;
}
public void setIdArea(Long idArea) {
this.idArea = idArea;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
问题内容: 我想通过注释@Query通过Jpa存储库进行Join查询。我有三个表。 本机查询是: 现在我有了Table Hibernate实体,所以我在ApplicationRepository中尝试过 日志说 意外的标记 有什么想法吗? 我的表实体 Application.java: Customer.java: User.java: 问题答案: 您不需要JPA中的ON子句,因为借助映射注释,J
本机查询为: 现在我有了表Hibernate实体,所以我在ApplicationRepository中尝试了 日志上说
我想使用带有注释@query的Jpa存储库创建一个连接查询。 我有两张桌子: 和: 我的表实体
我正在开发一个Spring Boot应用程序,并在我的存储库中挣扎于SQL查询。查询应该选择员工的所有ID,从来没有张贴在我的WebApp。 在MySQL Workbench中,遵循语句ist working propper和我实现了预期的结果。 我不知道如何使用“on”并定义它的路径。
问题内容: 我尝试实现JPA自定义存储库。 我有一个这样的过滤器对象: 从前端,我根据用户输入创建FilterPatient的实例。 因此,例如,用户可以值姓和cf属性或值和姓,等等。 我想实现一个自定义存储库,如下所示: 题: 根据用户输入,我必须执行其他查询,那么如何管理存储库?我必须编写查询方法以涵盖输入字段的不同组合,并且必须在服务中编写有关方法存储库调用的逻辑?或者我可以更好地自定义方法
我尝试实现一个JPA自定义存储库。 我有一个过滤器对象,如下所示: 在前端,我根据用户输入创建了一个FilterPatient实例。 按用户分类的示例查询 和其他可能的配置,例如,在FilterPatient的cf属性为NULL中,查询将变为: