一尘不染

计算Hibernate中多对多关系中的行数

jsp

我在Oracle(10g)数据库中拥有许多表,如下所示。我使用的是Spring版本3.0.2的Hibernate Tools3.2.1.GA。

  1. 产品 -父表
  2. 颜色 -父表
  3. ProductColour -连接表-引用colourIdprodIdColourProduct表分别

其中ProductColour是和之间的 联接表
。正如表名所暗示的,和之间存在多对多关系。我认为,数据库中的关系很容易想象,仅通过这么多的信息就可以清楚地知道。因此,我不会详细探讨这种关系。Product``Colour``Product``ProductColour

中的一个实体(行)Product与中的任何数量的实体关联,Colour并且中的一个实体(行)Colour也可以与中的任何数量的实体关联Product


举例来说,我需要计算Product表中可用的行数(关于Hibernate),可以通过以下方式完成。

Object rowCount = session.createCriteria(Product.class)
                  .setProjection(Projections.rowCount()).uniqueResult();

如果我需要计算ProductColour表中可用的行数怎么办?由于这是一个多对多关系,因此将其映射到Product和中的Colour实体类(POJO)中,java.util.Set并具有各自的对应关系,并且该ProductColour表没有直接的POJO类可用。因此,在这种情况下,前面的行计数语句似乎不起作用。

在Hibernate中,有没有一种精确的方法来计算这种 连接实体 的行数?


阅读 251

收藏
2020-06-10

共1个答案

一尘不染

我认为您应该能够大致执行JPQL或HQL。

SELECT count(p.colors) FROM Product AS p WHERE p.name = :name ... other search criteria etc

要么

SELECT count(c.products) FROM Color AS c WHERE c.name = :name .... other search criteria

从下面的评论,这应该工作:

Long colours=(Long) session.createQuery("select count(*) as cnt from Colour colour where colour.colourId in(select colours.colourId from Product product inner join product.colours colours where product.prodId=:prodId)").setParameter("prodId", prodId).uniqueResult();
2020-06-10