2

カラーテーブルと関係のある製品テーブルがあります

製品には多くの色があります... 例: 製品 A: 赤、緑、青、黄。

少なくとも RED と GREEN を含む製品を見つけたいです。

     DetachedCriteria colorCrit = DetachedCriteria.forClass(Color.class);

        ProjectionList colorList = new Projections.projectionList();
        colorList.add(Projections.groupProperty("productID"));
        colorList.add(Projections.rowCount(),"abc");
        colorCrit.setProjection(colorList);

        colorCrit.add(Restrictions.eq("color", "GREEN")
    colorCrit.add(Restrictions.eq("color", "RED")
    colorCrit.add(Restrictions.eq("abc",2);

    Criteria productCrit = new Criteria(Product.class);

    productCrit.add(Suqueries.in("id",colorCrit));
list<Product> productList = productCrit.list();

上記のコードを使用していますが、 on でグループを達成できませんProjections.rowCount()

私は .as を試しましたが、分離された基準を不適切な Suqueries にする追加の列が発生します。(値オラクルの例外が多すぎます)

colorCrit.add(Restrictions.eq(Projections.rowCount(),2);> 行数がプロパティではないため機能しません = x

select * from product pd where pd.id = (select cr.productID from color cr where cr.color="RED" or cr.color="GREEN" group by  cr.productID having rowcount=2

上記は適切な SQL クエリである必要があります。

解決策はありますか?

4

1 に答える 1

2

次のクエリを使用します。

select p from Product p where 
2 = (select count(color.id) from Product p2 
     inner join p2.colors color
     where p2.id = p.id
     and color.color in ('GREEN', 'RED'))

上記は、基準で次のように翻訳できます。

Criteria c = session.createCriteria(Product.class, "p")

DetachedCriteria sub = DetachedCriteria.forClass(Product.class, "p2");
sub.createAlias("p2.colors", "color");
sub.add(Restrictions.eqProperty("p2.id", "p.id"))
sub.add(Restrictions.in("color.color", new String[] {"RED", "GREEN"}));
sub.setProjection(Projections.count("color.id"));

c.add(Subqueries.eq(2, sub)); // or 2L

上記は、2 つの色が RED である製品を持つことができない、つまり、タプル(color, product_id)が table に一意の制約を持っていることを前提としていますcolor

于 2012-07-11T07:18:25.487 に答える