NamedQuery miss将表放在OnetoOne关系中

时间:2014-11-07 08:27:12

标签: java hibernate java-ee jpa jpql

我的项目中的命名查询有问题。我有2个具有OneToOne关系的实体。

@Entity
@Table(name = "SL_BRANCH_PARAMS")
public class BranchParams implements Identifiable {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SL_BRANCH_PARAM_SEQ_GEN")
    @SequenceGenerator(name = "SL_BRANCH_PARAM_SEQ_GEN", sequenceName = "SL_BRANCH_PARAM_SEQ")
    private Long id;

    @JoinColumn(name = "INTEREST_ACCOUNT_ID")
    @OneToOne(fetch = FetchType.EAGER)
    private AccountDef interestAccount;
}

和具有命名查询的第二个类

@Entity
@Table(name = "SL_ACCOUNT_DEF")
@NamedQueries({
    @NamedQuery(name = "AccountDef.getAvaibleInterestAccountsForBranch",
            query = "SELECT ad FROM AccountDef ad LEFT JOIN FETCH ad.branchParamsInterest WHERE     ad.branchParamsInterest = NULL ORDER BY ad.id ASC"),
})
public class AccountDef implements Identifiable {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SL_ACCOUNT_DEF_SEQ_GEN")
    @SequenceGenerator(name = "SL_ACCOUNT_DEF_SEQ_GEN", sequenceName = "SL_ACCOUNT_DEF_SEQ")
    private Long id;

    @OneToOne(fetch = FetchType.EAGER, mappedBy = "interestAccount")
    private BranchParams branchParamsInterest;
}

当我执行命名查询时,我将此查询发送到数据库

select
    accountdef0_.ID as ID1_10_0_,
    branchpara1_.ID as ID1_13_1_,
    branchpara1_.INTEREST_ACCOUNT_ID as INTERES16_13_1_
from
    SL_ACCOUNT_DEF accountdef0_ 
left outer join
    SL_BRANCH_PARAMS branchpara1_ 
        on accountdef0_.ID=branchpara1_.INTEREST_ACCOUNT_ID 
where
    accountdef0_.ID is null //this is incorrect
order by
    accountdef0_.ID ASC

这是不正确的,因为它没有给我任何行,因为它检查AccountDef中的ID是否为null而不是BranchParams。

正确的查询应如下所示

select
    accountdef0_.ID as ID1_10_0_,
    branchpara1_.ID as ID1_13_1_,
    branchpara1_.INTEREST_ACCOUNT_ID as INTERES16_13_1_
from
    SL_ACCOUNT_DEF accountdef0_ 
left outer join
    SL_BRANCH_PARAMS branchpara1_ 
        on accountdef0_.ID=branchpara1_.INTEREST_ACCOUNT_ID 
where
    branchpara1_.ID is null //this is correct
order by
    accountdef0_.ID ASC

并且这样的查询返回我想要的行。我的问题是,为什么命名查询检查AccountDef的null id值而不是BranchParams?

1 个答案:

答案 0 :(得分:0)

也许是这样的?

 @NamedQuery(name = "AccountDef.getAvaibleInterestAccountsForBranch",
        query = "SELECT ad FROM AccountDef ad LEFT JOIN FETCH ad.branchParamsInterest bp WHERE bp.interestAccount = NULL ORDER BY ad.id ASC")