2013-03-01 5 views
6

mam 2 klas Podmiot o wiele-do-wielu stowarzyszenieJPA wybrać z kolekcji z wielu-do-wielu stowarzyszenie

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; 

Czy możliwe wybieranie elementów z tabeli MOD_PM, które mają rekord w tabeli MOD_PM_SCOPE_TYPES dla SCOPE_TYPE_ID = 1

Natywne zapytanie SQL:

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

Jak mogę przetłumaczyć to zapytanie na JP QL?

+0

Klasa ModScopeType ma adnotacji Tabela zwane MOD_SCOPES nie znaczy int rekord on MOD_SCOPES tabeli? –

Odpowiedz

17

Kiedy odwołujesz się do SCOPE_TYPE_ID w zapytaniu, co masz na myśli? Może być identyfikatorem ScopeType lub innym polem, którego nie widzę. Zakładam, że brakuje pola typu zakresu.

Spróbuj tego:

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

Thx, zadziałało dobrze dla mnie. SCOPE_TYPE_ID to pole tabeli MOD_PM_SCOPE_TYPES, które ma 2 kolumny - PM_ID i SCOPE_TYPE_ID, z których każdy jest odnosił się do kolumny klucza podstawowego tabel MOD_PM i MOD_SCOPE_TYPES – Andrey