Ответ 1
Эта проблема возникает по двум причинам.
- Запрос JPQL недействителен.
- Вы не создали связь между вашими объектами, которые может использовать базовый запрос JPQL.
При выполнении соединения в JPQL вы должны убедиться, что существует базовая ассоциация между объектами, пытающимися быть соединенными. В вашем примере отсутствует связь между объектами User и Area. Чтобы создать эту ассоциацию, мы должны добавить поле Area в классе User и установить соответствующее JPA-сопоставление. Я добавил источник для пользователя ниже. (Обратите внимание, что я переместил сопоставления в поля)
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. Запрос, указанный в аннотации @Query, должен соответствовать правильному синтаксису, что означает, что вы должны опустить предложение on. См. Следующее:
@Query("select u.userName from User u inner join u.area ar where ar.idArea = :idArea")
При просмотре вашего вопроса я также установил связь между объектами User и Area двунаправленно. Вот источник для объекта 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;
}
}