我从来都不擅长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
有多对一到Vertoning
,Vertoning
有多对一到Zaal
,Zaal
有多对一到cinemacomplex
1}}
答案 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。