Java 条件、子查询、分组依据和具有更多

Java 条件、子查询、分组依据和具有更多,java,hibernate,criteria,Java,Hibernate,Criteria,我有一个与颜色表相关的产品表 一个产品可以有多种颜色。。。产品A:有红、绿、蓝、黄三种颜色 我希望找到至少含有红色和绿色的产品 DetachedCriteria colorCrit = DetachedCriteria.forClass(Color.class); ProjectionList colorList = new Projections.projectionList(); colorList.add(Projections.groupPro

我有一个与颜色表相关的产品表

一个产品可以有多种颜色。。。产品A:有红、绿、蓝、黄三种颜色

我希望找到至少含有红色和绿色的产品

     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();
以上应该是正确的SQL查询


我可以知道有什么解决办法吗?

我会使用以下查询:

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

以上假设您不能有一个有两种红色的产品,即元组
(color,product_id)
在表
color

productCrit.add(suquerys.in(“id”,colorCrit))中有唯一的约束;这个怎么样?我该如何做到这一点?我不明白你的解决方案应该如何运作。我在回答中提出的是另一个查询,它符合您的要求。它们看起来是依赖于子查询的,我担心这会影响性能。
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