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 个元素集合。

有任何想法吗?

更新:

一个可以理解的翻译查询将是这样的:

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 客户端的结果

4

1 回答 1

0
s.arrivalSerie.company

Serie在and之间创建一个内连接,并在 and 之间创建另一个ArrivalSerie内连接。并且内部连接将过滤掉所有具有空值的系列,这显然不是您想要的。因此,您需要改用左连接:ArrivalSerieCompany

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
于 2013-10-23T08:37:03.637 回答