2013-10-22 79 views
0

我们试图通过HQL执行以下查询,但我们被卡住了,并且此查询未向我们显示任何结果。休眠查询使用或不显示结果

select s from Serie s where 
(s.arrivalSerie is not null and s.arrivalSerie.company.isEnable=1) 
or (s.departureSerie is not null and s.departureSerie.company.isEnable=1) 

我们抛出这个查询有:

Query query = em.createQuery("previous query"); 
query.setFirstResult(initialElement); 

虽然测试此查询,我们发现了这个查询(“或”)可以用结果来执行的任何部分。但是当整个查询被执行时,我们得到0个元素集合。

任何想法?

UPDATE:

的理解翻译的查询会是这样的:

select 
     s.* 
    from 
     serie s, 
     arrivalSerie a, 
     company ca, 
     departureSerie d, 
     company cd 
    where 
     s.idArrivalSerie=a.idArrivalSerie 
     and a.CompanyCode=ca.CompanyCode 
     and s.idDepartureSerie=d.idDepartureSerie 
     and d.CompanyCode=cd.CompanyCode 
     and (
      (
       s.idArrivalSerie is not null 
      ) 
      and ca.isEnable=1 
      or (
       s.idDepartureSerie is not null 
      ) 
      and cd.isEnable=1 
     ) limit 0,10; 

当然这是不向我们展示结果在一个MySQL客户

+0

你能检查从这个hql生成的sql吗? –

+0

您可以通过在hibernate配置中将show-sql属性设置为true来进行调试,控制台将打印生成的SQL查询,您可以在数据库中运行它并查找。 – Zeus

+0

变量'initialElement'包含什么?如果你想要第一个元素,你应该把它设置为0. – Paolo

回答

0
s.arrivalSerie.company 

创建一个内部联接在SerieArrivalSerie之间,以及ArrivalSerieCompany之间的另一个内部联接。并且内部联接会过滤出所有具有null arrivalSerie的系列,这显然不是您想要的。所以你需要使用左连接代替:

select s from Serie s 
left join s.arrivalSerie arrivalSerie 
left join arrivalSerie.company arrivalCompany 
left join s.departureSerie departureSerie 
left join departureSerie.company departureCompany 
where arrivalCompany.isEnable = 1 or departureCompany.isEnable = 1 
+0

谢谢,我们终于找到了自己的解决方案。无论如何,解释赞赏(老实说,我们不知道到底是什么与最初的查询发生)。 –

+0

您应该在开发过程中始终打开SQL日志记录,查看Hibernate如何将HQL转换为SQL,并找出造成此类问题的原因。 –