ventajas update tutorial repositorio query pattern patron ejemplo data java jpa orm repository jpql

java - tutorial - update jpa repository



Cómo definir una consulta de repositorio JPA con una combinación (1)

Usted está experimentando este problema por dos razones.

  • La consulta JPQL no es válida.
  • No ha creado una asociación entre sus entidades que la consulta JPQL subyacente pueda utilizar.

Al realizar una unión en JPQL, debe asegurarse de que exista una asociación subyacente entre las entidades que intentan unirse. En su ejemplo, falta una asociación entre el Usuario y las entidades del Área. Para crear esta asociación, debemos agregar un campo de área dentro de la clase de usuario y establecer la asignación de JPA adecuada. He adjuntado la fuente del usuario a continuación. (Tenga en cuenta que moví las asignaciones a los campos)

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; } }

Una vez establecida esta relación, puede hacer referencia al objeto de área en su declaración @Query. La consulta especificada en su anotación @Query debe seguir la sintaxis adecuada, lo que significa que debe omitir la cláusula on. Vea lo siguiente:

@Query("select u.userName from User u inner join u.area ar where ar.idArea = :idArea")

Al analizar su pregunta, también hice que la relación entre el Usuario y las entidades de Área fuera bidireccional. Aquí está la fuente para que la entidad Área establezca la relación bidireccional.

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; } }

Me gustaría realizar una consulta de unión usando el repositorio Jpa con la anotación @Query.

Tengo dos mesas:

table user with iduser,user_name

y:

table area with idarea, area_name and iduser

La consulta nativa es:

SELECT u.user_name FROM user as u INNER JOIN area as a ON a.iduser = u.iduser WHERE a.idarea = 4

Ahora tengo un usuario y área de la entidad Table Hibernate

Así que probé con 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);

El registro dice:

símbolo inesperado:

Cualquier Idea, por favor?

Mi mesa Entidad

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