您遇到此问题的原因有两个。
- JPQL查询无效。
- 您尚未在基础JPQL查询可以利用的实体之间创建关联。
在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; }}


