2013-03-01 9 views
6

tôi đã nhận 2 lớp Entity với Nhiều-to-Nhiều hiệp hộiJPA chọn từ bộ sưu tập với nhiều-nhiều hiệp hội

ModPm:

@Entity 
@Table(name="MOD_PM") 
public class ModPm extends WebPageObject implements Serializable, IDBNamedEntity { 

    private static final long serialVersionUID = 1L; 

    public final static String Q_GET_WITHOUT_STATUS_FOR_SCOPE = "ModPm.getWithoutStatusForScope"; 

    @Id 
    private long id; 
    ..... 
    @ManyToMany 
    @JoinTable(
     name="MOD_PM_SCOPE_TYPES" 
     , joinColumns={ 
      @JoinColumn(name="PM_ID") 
      } 
     , inverseJoinColumns={ 
      @JoinColumn(name="SCOPE_TYPE_ID") 
      } 
     ) 
    private List<ModScopeType> modScopeTypes; 

ModScopeType:

@Entity 
@Table(name="MOD_SCOPES") 
@Cacheable 
public class ModScopeType extends WebPageObject implements Serializable { 

    private static final long serialVersionUID = 1L; 

    public final static String Q_GET_ALL = "ModScopeType.getAll"; 

    @Id 
    @Column(name="ID") 
    private long id; 

.... 

    //bi-directional many-to-many association to ModPm 
    @ManyToMany 
    @JoinTable(
     name="MOD_PM_SCOPE_TYPES" 
     , joinColumns={ 
      @JoinColumn(name="SCOPE_TYPE_ID") 
      } 
     , inverseJoinColumns={ 
      @JoinColumn(name="PM_ID") 
      } 
     ) 
    private List<ModPm> modPms; 

Có có thể chọn các thực thể từ bảng MOD_PM có bản ghi trong bảng MOD_PM_SCOPE_TYPES cho SCOPE_TYPE_ID = 1

Truy vấn SQL Gốc:

SELECT ID, NAME FROM MOD_PM WHERE ID IN (SELECT PM_ID FROM MOD_PM_SCOPE_TYPES WHERE SCOPE_TYPE_ID=1) 

Làm cách nào để dịch truy vấn này sang JP QL?

+0

Lớp ModScopeType có một bảng chú thích gọi MOD_SCOPES không bạn có nghĩa là một int kỷ lục ông MOD_SCOPES bảng? –

Trả lời

17

Khi bạn tham khảo SCOPE_TYPE_ID trong truy vấn bạn đang đề cập đến điều gì? Có thể là ID của ScopeType hoặc một trường khác mà tôi không thấy. Tôi giả định trường id loại phạm vi bị thiếu.

Hãy thử điều này:

select p from ModPm p join p.modScopeTypes type where type.scopeTypeId = 1 
+0

Thx, đã làm việc tốt cho tôi. SCOPE_TYPE_ID là trường của bảng MOD_PM_SCOPE_TYPES, có 2 cột - PM_ID và SCOPE_TYPE_ID, mỗi cột được tham chiếu đến cột khóa chính của bảng MOD_PM và MOD_SCOPE_TYPES – Andrey