我在Oracle(10g)数据库中有三个表,如下所示。我正在使用Hibernate Tools 3.2.1.GA和Spring 3.0.2版。
colourId
和prodId
个Colour
和Product
ProductColour
与Product
之间Colour
是联接表的位置。正如表格所暗示的那样,Product
和ProductColour
之间存在多对多关系。我认为,数据库中的关系很容易想象,只有这么多信息才能清楚。因此,我不打算详细探讨这种关系。
Product
中的一个实体(行)与Colour
中的任意数字实体相关联,Colour
中的一个实体(行)也可以与{Product
中的任意数量的实体相关联1}}。
让我们假设一个例子,我需要计算Product
表中可用的行数(关于Hibernate),它可以像下面那样完成。
Object rowCount = session.createCriteria(Product.class)
.setProjection(Projections.rowCount()).uniqueResult();
如果我需要计算ProductColour
表中可用的行数,该怎么办?由于它是多对多关系,因此它在Product
和Colour
实体类(POJO)中映射到相应的java.util.Set
,并且没有针对ProductColour
的直接POJO类{1}}表可用。因此,前面的行计数语句似乎在这种情况下不起作用。
有没有一种精确的方法来计算Hibernate中这种连接实体的行数?
答案 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();