2012-10-31 7 views
22

Chciałbym utworzyć kwerendę przy użyciu repozytorium Jpa z adnotacją @Query.Jak zdefiniować kwerendę repozytorium JPA z dołączeniem

Mam dwie tabele:

table user 
with iduser,user_name 

oraz:

table area 
with idarea, area_name and iduser 

Natywna zapytania to:

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

Teraz mam Tabela hibernacji podmiot Użytkownika i Przestrzeni

Więc próbowałem z 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); 

Log mówi:

nieoczekiwany znak:

jakiś pomysł, proszę?

Moja tabela Podmiot

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

Odpowiedz

34

występuje ten problem, z dwóch powodów.

  • Zapytanie JPQL jest niepoprawne.
  • Nie utworzyłeś powiązania między twoimi jednostkami, które może wykorzystać podstawowe zapytanie JPQL.

Podczas wykonywania sprzężenia w JPQL należy upewnić się, że istnieje podstawowe powiązanie między podmiotami, które próbują się połączyć. W twoim przykładzie brakuje powiązania między użytkownikiem a jednostkami obszaru. Aby utworzyć to powiązanie, musimy dodać pole Obszar w klasie Użytkownik i ustanowić odpowiednie Mapowanie JPA. Załączam źródło dla użytkownika poniżej. (Należy pamiętać, że przeniósł się do mapowania pól)

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

Gdy związek ten jest ustanowiony można odwoływać przedmiot kierunkowy w swojej deklaracji @query. Zapytanie określone w adnotacji @Query musi być zgodne z właściwą składnią, co oznacza, że ​​należy pominąć klauzulę on. Zobacz poniżej:

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

Podczas sprawdzania Twojego pytania utworzyłem również relację między Użytkownikami a Obiektami Obszaru dwukierunkową. Oto źródło dla elementu Area, aby ustanowić relację dwukierunkową.

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

... Niestety popełniłem błąd teraz skorygować post ... – Shinigami

+1

zamieścić swoje podmioty, trzeba się upewnić, że masz je wiąże –

+1

ok, ja Czy nie utworzyłeś związku – Shinigami

Powiązane problemy