【问题标题】:Why are the additional crossjoins generated in hibernate?为什么在休眠中会生成额外的交叉连接?
【发布时间】:2012-06-03 22:47:15
【问题描述】:

休眠查询

hql.append("FROM TBucket t1 JOIN FETCH t1.prd JOIN FETCH t1.psAct ");

配置

TBucket
@Table (name = "vw_f_t_bucket")

      @ManyToOne (cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER, targetEntity = Posprd.class)
      @JoinColumns({
          @JoinColumn(name = "prod_key", referencedColumnName="prod_key"),
          @JoinColumn(name = "prod_cycle_key", referencedColumnName="cycle_key"),
      })

      public IPosprd getprd() {
        return prd;
      }

prd ( 

@Table (name = "snp_prd")
public class Posprd implements IPosprd {

)


      @ManyToOne (cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER, targetEntity = Pospsact.class)
      @JoinColumn (name = "ps_act_key", nullable = false)
      public IPospsact getpsact() {
            return psAct;
      }      

psAct (
    @Table (name = "vw_ps_act_firm")
    public class PosPsact implements IPospsact {
)

生成查询

FROM vw_f_t_bucket tbucke0_
         INNER JOIN snp_prd posprd1_
            ON tbucke0_.prod_cycle_key = posprd1_.cycle_key
               AND tbucke0_.prod_key = posprd1_.prod_key

        JOIN FETCH t1.psAct                 

         INNER JOIN vw_ps_act_firm pospsn2_
            ON tbucke0_.ps_act_key = pspsn2_.ps_act_key

CROSS JOIN snp_prd posprd3_
CROSS JOIN vw_ps_act_firm pospsn5_
where tbucke0_.prod_cycle_key=posprd3_.cycle_key and tbucke0_.prod_key=posprd3_.prod_key and tbucke0_.posn_acct_key=pospsn5_.posn_act_key

从上面可以看出,hibernate 在最后生成交叉连接。这是为什么?如何阻止休眠生成这些交叉连接?

如果我只使用 hql 之类的

"FROM TBucket t1  ";

正在生成

from vw_f_t_bucket tbucke0_ 
cross join snp_prd psprd1_ cross join vw_psn_act_firm pspsn3_ 

如何让它进行常规连接而不是交叉连接?

【问题讨论】:

    标签: java hibernate jakarta-ee hql


    【解决方案1】:

    您在查询中既指定了急切获取,也指定了 JOIN FETCH。 JOIN FETCH 是不必要的,因为该属性已经为 Eager fetch 进行了注释(因此 FROM 中的内部连接。)

    【讨论】:

    • 我删除了 JOIN FETCH,“生成查询”中的 JOIN FETCH 消失了,但交叉连接仍然存在。我该怎么办?
    • 这是所有实体吗?也许实体上的这些表还有其他映射?老实说,我以前从未见过 hibernate 编写完整的交叉连接。
    • 问题不是使用 from TBucket t1 join t1.prd p 和 Criteria,我应该在 (?,?) 中使用 p.excgId 我在 (?,?) 中使用像 t1.prd.excgId 这样的 Criteria ( ?,?)。这就是它生成交叉连接的原因。我应该使用别名进行过滤。不过,感谢您的帮助。
    猜你喜欢
    • 2017-09-22
    • 2011-06-18
    • 2011-09-20
    • 2011-12-27
    • 2017-01-14
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多