gpt4 book ai didi

java - 为什么 hibernate 在最后添加到我的查询交叉连接

转载 作者:行者123 更新时间:2023-11-29 04:36:47 24 4
gpt4 key购买 nike

我正在通过这个基于 Hibernate 的代码构建和运行一个查询:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> criteria = cb.createTupleQuery();
Root<hisaVO> hisa = criteria.from(hisaVO.class);
Root<EstablecVO> establec = criteria.from(EstablecVO.class);
Root<DisaVO> disa = criteria.from(DisaVO.class);
Root<RedVO> red1 = criteria.from(RedVO.class);
Root<MicroredVO> microred = criteria.from(MicroredVO.class);
Root<Unidad_EjecutoraVO> ue1 = criteria.from(Unidad_EjecutoraVO.class);
Join<hisaVO,EstablecVO> j1 = hisa.join("estab");
Join<EstablecVO,DisaVO> j2 = j1.join("disa") ;
Join<EstablecVO,RedVO> j3 = j1.join("red") ;
Join<EstablecVO,MicroredVO> j4 = j1.join("microred") ;
Join<EstablecVO,Unidad_EjecutoraVO> j5 = j1.join("ue") ;

criteria.multiselect(j3.get("red_nombre"), cb.count(hisa))
.groupBy(red1.get("red_nombre"));

return em.createQuery(criteria).getResultList();

日志显示 Hibernate 正在通过相应的 SQL 实现:

select
redvo3_.red_nombre as col_0_0_,
count(hisavo0_.id) as col_1_0_
from
hisa hisavo0_
inner join establec establecvo6_
on hisavo0_.cod_estab=establecvo6_.COD_ESTAB
inner join disa disavo7_
on establecvo6_.cod_disa=disavo7_.id
inner join red redvo8_
on establecvo6_.cod_red=redvo8_.id
inner join microred microredvo9_
on establecvo6_.cod_mic=microredvo9_.id
inner join unidad_ejecutora unidad_eje10_
on establecvo6_.cod_ue=unidad_eje10_.id
cross join establec establecvo1_
cross join disa disavo2_
cross join red redvo3_
cross join microred microredvo4_
cross join unidad_ejecutora unidad_eje5_
group by redvo3_.red_nombre

它似乎在查询末尾添加了额外的、意想不到的 cross join。为什么要这样做?

最佳答案

您通过多次调用 CriteriaQuery.from() 为您的查询提供多个根。第一个之后的每个都通过 cross join 反射(reflect)在最终查询中。这就是查询根的意思

您不需要(也不应该)使用 CriteriaQuery.from() 将实体添加到您打算通过对应于映射关系的内部联接关联的查询 - 那些您连接的通过在运行查询时用作 SelectionJoin

关于java - 为什么 hibernate 在最后添加到我的查询交叉连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39352936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com