2016-08-04 11 views
0

Beim Mappen von zwei oder mehr Spalten in innerjoin gibt es eine Karte zu den Bedingungen und Kann ich ändern oder eine Bedingung?Wenn die JPA InnerJoin, Wie kann ich 'und' zu 'oder'?

Geordnete Tabelle

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user") 
private List<KeyboxDept> keyboxDept; 

Kindertisch

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumns({ 
    @JoinColumn(name = "KEY_TARGET_ID", referencedColumnName = "DEPT_ID", insertable = false, updatable = false), 
    @JoinColumn(name = "KEY_TARGET_UPPER_ID", referencedColumnName = "DEPT_ID", insertable = false, updatable = false) 
}) 
private User user; 

Query

gemacht
select 
     user0_.user_id as user_id1_3_, 
     user0_.dept_id as dept_id2_3_, 
     user0_.posi_id as posi_id3_3_ 
    from 
     cm_user user0_ 
    inner join 
     cm_keybox_dept keyboxdept2_ 
      on user0_.dept_id=keyboxdept2_.key_target_id 
      and user0_.dept_id=keyboxdept2_.key_target_upper_id 
    where 
     user0_.user_id=? limit ? 

Kann ich and -> or wechseln ???

+0

Nein, weil es im Zusammenhang mit einer N-1-Beziehung keinen Sinn macht. –

Antwort

0

Ich bin nicht sicher über JPA sondern in der Ruhe Kriterien können wir dies tun ....

Criteria criteria = session.createCriteria(persistentClass); 
criteria.createCriteria("propertyName", Criteria.LEFT_JOIN); 
0

Sie cascade = CascadeType.ALL in Entitätsdefinition haben. Das bedeutet The operations that must be cascaded to the target of the association. Also das Ziel (KeyboxDept in Ihrem Code) muss existieren. Wenn Sie es entfernen, bedeutet das, dass keine Operationen kaskadiert werden. Ich denke, dass die generierte SQL-Anweisung keine inner hat.

0

Wenn Ihr Suchkriterium kein Fremdschlüssel ist, der mit dem verknüpften Tabellenschlüssel übereinstimmt, können Sie diese Syntax nicht verwenden, da offensichtlich eine AND-Beziehung zwischen den separaten Spaltenteilen (@JoinColumn-Elementen) des Fremdschlüssels besteht. Aus diesem Grund enthält das generierte native SQL das AND. Wenn Sie das OR benötigen, müssen Sie dieses Mitglied mit einer separaten JPQL-Abfrage initialisieren, die das OR enthält, und Sie benötigen nicht die Annotation @ManyToOne.