我在Oracle(10g)数据库中拥有许多表,如下所示。我使用的是Spring版本3.0.2的Hibernate Tools3.2.1.GA。
colourId
prodId
Colour
Product
其中ProductColour是和之间的 联接表 。正如表名所暗示的,和之间存在多对多关系。我认为,数据库中的关系很容易想象,仅通过这么多的信息就可以清楚地知道。因此,我不会详细探讨这种关系。Product``Colour``Product``ProductColour
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类可用。因此,在这种情况下,前面的行计数语句似乎不起作用。
java.util.Set
在Hibernate中,有没有一种精确的方法来计算这种 连接实体 的行数?
我认为您应该能够大致执行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();