【问题标题】:Count the number of rows in many to many relationships in Hibernate在 Hibernate 中计算多对多关系中的行数
【发布时间】:2012-11-12 20:15:23
【问题描述】:

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

  1. 产品 - 父表
  2. 颜色 - 父表
  3. ProductColour - 连接表 - 分别引用 ColourProduct 表中的 colourIdprodId

ProductColourProductColour 之间的连接表。正如表名所暗示的,ProductProductColour 之间存在多对多关系。我认为,数据库中的关系很容易想象,只有这么多信息就很清楚了。因此,我不打算详细探讨这种关系。

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


举个例子,我需要计算Product表中可用的行数(关于Hibernate),可以这样做。

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

如果我需要计算ProductColour 表中可用的行数怎么办?因为它是多对多关系,所以它被映射到 ProductColour 实体类 (POJO) 中,并有各自的 java.util.SetProductColour 表的直接 POJO 类可用。所以前面的行计数语句在这种情况下似乎不起作用。

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

【问题讨论】:

  • 已经看到this问题。

标签: spring hibernate jsp count oracle10g


【解决方案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();

【讨论】:

  • 我已经尝试过使用这个 HQL Object o=session.createQuery("select count(p.colours) from Product p where prodId=:prodId").setParameter("prodId", prodId).uniqueResult(); 但不幸的是它抛出了一个异常 - org.hibernate.exception.SQLGrammarException: could not execute query 其中p.coloursProduct 实体类中的一个有效属性。感谢您的回复。
  • 嗨,它适用于这个 HQL 语句 - 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();。根据this 回答。您现在可以更新您的答案以反映更多。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多