2012-10-31 30 views
22

我想使用帶註釋@Query的Jpa存儲庫進行連接查詢。如何使用連接定義JPA存儲庫查詢

我有兩個表:

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

日誌說:

意外的標記:

什麼想法,請?

我的表實體

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

回答

34

遇到了兩方面的原因這個問題。

  • JPQL查詢無效。
  • 您尚未在您的實體之間創建基礎JPQL查詢可以使用的關聯。

當在JPQL中執行連接時,您必須確保嘗試連接的實體之間存在底層關聯。在你的例子中,你缺少用戶和區域實體之間的關聯。爲了創建這種關聯,我們必須在User類中添加一個Area字段並建立適當的JPA映射。我在下面附加了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聲明。在@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; 
    } 
} 
+1

對不起......我犯了一個錯誤,現在我修正後... – Shinigami

+1

安置自己的實體,你需要確保你有他們相關 –

+1

好吧,我didn t make association – Shinigami