当使用JPA innerJoin时,我该如何改变'和'到'或'?

时间:2016-08-04 06:17:44

标签: java spring jpa

在innerjoin中映射两个或多个列时,会有一个映射条件和 我可以改变或状况吗?

父表

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

我可以切换and -> or ???

3 个答案:

答案 0 :(得分:0)

我不确定JPA但是在Hibernate Using Criteria中我们可以这样做....

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

答案 1 :(得分:0)

您在实体定义中有cascade = CascadeType.ALL。这意味着,The operations that must be cascaded to the target of the association。因此,目标(代码中的KeyboxDept)必须存在。如果删除它,意味着没有级联操作,我认为生成的sql没有inner

答案 2 :(得分:0)

如果搜索条件不是与连接表键匹配的外键,则不能使用此语法,因为外键的单独列部分(@JoinColumn元素)之间显然存在AND关系。这就是生成的本机SQL包含AND的原因。如果需要OR,则需要使用包含OR的单独JPQL查询初始化该成员,并且不需要注释@ManyToOne。