Подтвердить что ты не робот

Как определить запрос репозитория JPA с помощью объединения

Я хотел бы сделать запрос на присоединение с использованием репозитория Jpa с аннотацией @Query.

У меня есть две таблицы:

 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

Теперь у меня есть таблица Hibernate сущности пользователя и области

Поэтому я попытался с 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);

Журнал говорит:

неожиданный маркер:

Любая идея, пожалуйста?

Моя таблица Entity

#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;
    }       
}
4b9b3361

Ответ 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;
    }
}

Ответ 2

Как установить время запроса для такого рода запросов?