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

时间:2012-11-12 20:15:24

标签: spring hibernate jsp count oracle10g

我在Oracle(10g)数据库中有三个表,如下所示。我正在使用Hibernate Tools 3.2.1.GA和Spring 3.0.2版。

  1. 产品 - 父表
  2. 颜色 - 父表
  3. ProductColour - 加入表格 - 分别引用colourIdprodIdColourProduct
  4. ProductColourProduct之间Colour联接表的位置。正如表格所暗示的那样,ProductProductColour之间存在多对多关系。我认为,数据库中的关系很容易想象,只有这么多信息才能清楚。因此,我不打算详细探讨这种关系。

    Product中的一个实体(行)与Colour中的任意数字实体相关联,Colour中的一个实体(行)也可以与{Product中的任意数量的实体相关联1}}。


    让我们假设一个例子,我需要计算Product表中可用的行数(关于Hibernate),它可以像下面那样完成。

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

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

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

1 个答案:

答案 0 :(得分: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();