Почему в спящем режиме генерируются дополнительные перекрестные соединения?

Запрос гибернации

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_ 

Как я могу заставить его выполнять обычное соединение вместо перекрестного?


person Community    schedule 29.05.2012    source источник


Ответы (1)


Вы оба указали нетерпеливую выборку, а также указали JOIN FETCH в своем запросе. JOIN FETCH не нужен, так как свойство уже аннотировано для нетерпеливой выборки (следовательно, внутреннее соединение в FROM.)

person Affe    schedule 29.05.2012
comment
Я удалил JOIN FETCH, JOIN FETCH в Генерирующем запросе исчез, но перекрестные соединения остались. Что я могу с этим поделать? - person ; 29.05.2012
comment
Это все сущности? возможно, есть другие сопоставления с этими таблицами в сущности? Честно говоря, я никогда раньше не видел, чтобы hibernate писал полное перекрестное соединение. - person Affe; 30.05.2012
comment
проблема вместо использования из TBucket t1 join t1.prd p и в Criteria я должен использовать p.excgId в (?,?) Я использовал критерии, такие как t1.prd.excgId в (?,?). Вот почему он генерировал перекрестные соединения. Я должен использовать псевдоним для фильтрации. Но спасибо за помощь. - person ; 30.05.2012