2016-08-04 5 views
0

2つ以上の列を内部結合にマッピングすると、条件へのマップがあり、 変更することはできますか?JPA innerJoinを使用する場合、どのように変更できますか?および 'to'または '?

親テーブル

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

子テーブル

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

クエリは

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 ? 

iがand -> orを切り替えることができます作られています?

+0

N-1関係の文脈で意味をなさないため、いいえ。 –

答えて

0

私は

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

あなたはエンティティ定義でcascade = CascadeType.ALLを持っている.... JPA程度が、我々はこれを行うことができます基準を使用して休止状態にはわかりません。つまり、The operations that must be cascaded to the target of the associationを意味します。そのため、コード内にターゲット(KeyboxDept)が存在する必要があります。それを削除すると、操作がカスケードされていないことを意味します。生成されるSQLにはinnerが含まれないと思います。

0

外部キーの別の列部分(@JoinColumn要素)間に明らかにAND関係があるため、結合されたテーブルキーに一致する外部キーでない場合、この構文は使用できません。このため、生成されたネイティブSQLにはANDが含まれています。 ORが必要な場合は、ORを含む別のJPQLクエリでそのメンバを初期化し、アノテーション@ManyToOneは必要ありません。

関連する問題