2012-11-12 66 views
1

我在Oracle(10g)數據庫中有許多表中的三個,如下所示。我在Spring 3.0.2版本中使用Hibernate Tools 3.2.1.GA。在休眠中計算多對多關係的行數

  1. 產品 - 父表
  2. 顏色 - 父表
  3. ProductColour - 連接表 - 引用colourIdColourprodId分別Product

ProductColour是一個連接表ProductColour之間。如表名暗示的那樣,ProductProductColour之間存在多對多關係。我認爲,數據庫中的關係可以很容易地想象出來,而且只有這麼多的信息纔是清楚的。因此,我不會詳細探討這種關係。

一個在Product實體(行)與在ColourColour和一個實體(行)的任何數量的實體也可以與在Product任何數量的實體相關聯的相關聯。


比方說,作爲一個例子,我需要計算在Product表(關於休眠),這是可以做到像下面這樣可用的行數。

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

如果我需要計數行的ProductColour表中提供的號碼是多少?因爲它是一個多對多的關係,所以它被映射到ProductColour實體類(POJO)中,它們分別有java.util.Set,並且ProductColour表沒有直接POJO類。所以前面的行計數語句在這種情況下似乎不起作用。

有沒有一種精確的方法來計算Hibernate中這樣一個連接實體的行數?

+0

已經看到[此](http://stackoverflow.com/q/3358843/1391249 ) 題。 – Tiny

回答

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(); 
+0

我試過用這個HQL對象o = session.createQuery(「select count(p.colours)from Product p where prodId =:prodId」)。setParameter(「prodId」,prodId).uniqueResult();'但是它不幸的是拋出了一個異常 - 'org.hibernate.exception.SQLGrammarException:無法執行查詢',其中'p.colours'是'Product'實體類中的一個有效屬性。謝謝回覆。 – Tiny

+0

嗨,它使用這個HQL語句 - 「長顏色=(長)session.createQuery(」選擇計數(*)作爲cnt從顏色顏色其中colour.colourId在(從產品product colour.colourId中選擇inner join product.colours顏色,其中product.prodId =:prodId)「)。setParameter(」prodId「,prodId).uniqueResult();'。根據[this](http://stackoverflow.com/a/13388254/1391249)回答。你現在可以更新你的答案,以反映儘可能多的。謝謝。 – Tiny