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

Spring 计算Hibernate中多对多关系中的行数,spring,hibernate,jsp,count,oracle10g,Spring,Hibernate,Jsp,Count,Oracle10g,Oracle 10g数据库中有三个表,如下所示。我正在使用Hibernate工具3.2.1.GA和Spring版本3.0.2 产品-父表 颜色-父表 ProductColor-连接表-分别参考颜色表和产品表的COLORIID和prodId 其中ProductColor是产品和颜色之间的连接表。正如表名所示,产品和ProductColor之间存在多对多关系。我认为,数据库中的关系可以很容易地想象出来,而且只有这么多的信息才清楚。因此,我不打算详细探讨这种关系 产品中的一个实体行与颜色中的任意数量的

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

产品-父表 颜色-父表 ProductColor-连接表-分别参考颜色表和产品表的COLORIID和prodId 其中ProductColor是产品和颜色之间的连接表。正如表名所示,产品和ProductColor之间存在多对多关系。我认为,数据库中的关系可以很容易地想象出来,而且只有这么多的信息才清楚。因此,我不打算详细探讨这种关系

产品中的一个实体行与颜色中的任意数量的实体相关联,颜色中的一个实体行也可以与产品中的任意数量的实体相关联

举个例子,我需要计算产品表中关于Hibernate的可用行数,可以执行如下操作

Object rowCount = session.createCriteria(Product.class)
                  .setProjection(Projections.rowCount()).uniqueResult();
如果我需要计算ProductColor表中可用的行数,该怎么办?由于它是一种多对多关系,因此在Product和Color实体类POJO中映射了它,分别有java.util.Set和ProductColor表的直接POJO类。因此,前面的行计数语句在这种情况下似乎不起作用


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

我认为您应该能够按照这一思路进行JPQL或HQL

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

从下面的评论来看,这应该是可行的:


我认为您应该能够按照这一思路进行JPQL或HQL

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

从下面的评论来看,这应该是可行的:


已看到问题。已看到问题。我已尝试使用此HQL对象o=session.CreateQuerySelectCountP.Colors from Product p,其中prodId=:prodId.setParameterprodId,prodId.uniqueResult;但不幸的是,它抛出了一个异常-org.hibernate.exception.sqlgrammareexception:无法执行查询,其中p.colors是产品实体类中的有效属性。感谢您的回复。您好,它与此HQL语句一起工作-Long colors=Long session.createQueryselect count*作为cnt from color Colour where Colour.colorId inselect colors.colorId from Product-Product-Product-inner-join Product.colors-colors where-Product.prodId=:prodId.setParameterpremodid,prodId.uniqueResult;。根据答案。您现在可以更新您的答案,以反映尽可能多的信息。谢谢。我已尝试使用此HQL对象o=session.createQuerySelectCountP.colors from Product p,其中prodId=:prodId.setParameterPremodid,prodId.uniqueResult;但不幸的是,它抛出了一个异常-org.hibernate.exception.sqlgrammareexception:无法执行查询,其中p.colors是产品实体类中的有效属性。感谢您的回复。您好,它与此HQL语句一起工作-Long colors=Long session.createQueryselect count*作为cnt from color Colour where Colour.colorId inselect colors.colorId from Product-Product-Product-inner-join Product.colors-colors where-Product.prodId=:prodId.setParameterpremodid,prodId.uniqueResult;。根据答案。您现在可以更新您的答案,以反映尽可能多的信息。非常感谢。
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();