从另外两个查询中提出一个问题?

时间:2014-08-22 11:48:06

标签: java mysql hibernate jpa subquery

我从来都不擅长SQL查询(我总是喜欢NoSQL数据库,但这次我需要使用SQL数据库。)

我需要研究与电影院大厅的总座位数相比销售的座位数量。目前我可以在Hibernate中使用2个不同的查询来完成此操作,一个用于总座位数,另一个用于销售座位数,然后将这些结果分开。

这是我的代码:

    Double amountOfSoldTickets = ((Long) session.createQuery("select count(*) from Ticket t where t.vertoning.zaal.cinemacomplex.id = :id").
                setInteger("id", complex.getId()).list().get(0)).doubleValue();
    Double capacity= ((Long) session.createQuery("select sum(z.capaciteit) from Zaal z").list().get(0)).doubleValue();
    return amountOfSoldTickets / capacity;

我想过使用子查询但我不知道如何在hibernate中执行此操作。 如果有人知道如何在一个查询中解决这个问题,我们将非常感激。

一些额外的信息:我让hibernate在第一个查询中隐式加入我的表。

Ticket有多对一到VertoningVertoning有多对一到ZaalZaal有多对一到cinemacomplex 1}}

2 个答案:

答案 0 :(得分:1)

我鼓励您学习SQL - 并在真实数据库而不是通过HQL接口学习它。 HQL对它的功能非常有用,但它缺少一些非常重要的SQL功能。

我相信以下内容适用于HQL:

select count(*) as SoldSeats,
       (select sum(z.capaciteit) from Zaal z) as Capacity
from Ticket t
where t.vertoning.zaal.cinemacomplex.id = :id;

在MySQL中,你可以将它们作为子查询放在from子句中:

select t.SoldSeats, z.Capacity
from (select count(*) as SoldSeats,
      from Ticket t
      where t.vertoning.zaal.cinemacomplex.id = :id
     ) t
     (select sum(z.capaciteit)  as Capacity
      from Zaal z
     ) z;

请注意,如果这是在为id分配不同值的循环内部,那么整个循环可能会替换为SQL。

答案 1 :(得分:1)

我建议您运行此查询:

Long[] amountOfSoldTicketsToCapacity = 
    ((Long[]) session.createQuery(
        "select count(*), z.capaciteit, z.id " +
        "from Ticket t " +
        "inner join t.vertoning v " +
        "inner join v.zaal z " +
        "inner join z.cinemacomplex c " +
        "where c.id = :id " +
        "group by z.capaciteit, z.id "
        )
        .setInteger("id", complex.getId())
        .uniqueResult());
if {
    throw new IllegalArgumentException("There are no tickets sold for Zaal#" + complex.getId());
}       
double capacity = (amountOfSoldTicketsToCapacity.length != 0) ? 
    ((double) amountOfSoldTicketsToCapacity[0]) / amountOfSoldTicketsToCapacity[1] : 0D;

在Java中进行划分更简单,就像在SQL中一样,您可能需要CAST one operand to NUMERIC