1

以下に示すように、Oracle(10g)データベースには多くのテーブルのうち3つがあります。Springバージョン3.0.2でHibernateTools3.2.1.GAを使用しています。

  1. 製品-親テーブル
  2. -親テーブル
  3. ProductColour-テーブルの結合-参照colourIdprodIdofColourおよびProductテーブルそれぞれ

ここで、はとの間のProductColour結合テーブルです。テーブル名が示すように、との間には多対多の関係があります。データベース内の関係は簡単に想像でき、これだけの情報で明確になると思います。したがって、この関係について詳しく説明するつもりはありません。ProductColourProductProductColour

の1つのエンティティ(行)Productは、の任意の数のエンティティに関連付けられColour、の1つのエンティティ(行)はColour、の任意の数のエンティティに関連付けることもできますProduct


たとえば、Productテーブルで使用可能な行数をカウントする必要があるとしましょう(Hibernateに関して)。これは、次のように実行できます。

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

ProductColourテーブルで使用可能な行数をカウントする必要がある場合はどうなりますか?これは多対多の関係であるため、ProductおよびColourエンティティクラス(POJO)にマッピングされ、テーブルjava.util.Setの直接POJOクラスは使用できません。ProductColourしたがって、前述の行カウントステートメントはこのシナリオでは機能しないようです。

Hibernateでそのような結合エンティティの行数をカウントする正確な方法はありますか?

4

1 に答える 1

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();
于 2012-11-12T21:34:50.210 に答える