【问题标题】:One to Many search using AND condition使用 AND 条件进行一对多搜索
【发布时间】:2012-07-09 16:37:28
【问题描述】:

我有以下包含多种颜色的产品。

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

Product class

    String id;

    List<Color> colors{};

Color class

    id

    color

kindly ignore the syntax error.

我可以使用以下搜索 OR 条件。

Criteria criteria = createCriteria();
criteria.createAlias("colors","colors");

List<String> colorsList = new LinkedList();
colorsList.add("GREEN");
colorsList.add("RED");
criteria.add(Restriction.in("colors.color",colorsList);

以上将给我的产品颜色为红色或绿色,但不是至少包含红色和绿色的产品。

例子

Product: RED GREEN - PASS
Product: RED GREEN YELLOW - PASS
Product: RED YELLOW - FAIL

提前致谢。

【问题讨论】:

  • 您的意思是您需要所有具有红色和绿色颜色的产品,以及相同的产品但颜色不同。 (换句话说,您不需要任何没有红色和绿色字母的产品)。这是真的吗?
  • 是的。示例:将显示产品绿色红色黄色

标签: java hibernate hibernate-criteria


【解决方案1】:

我们的想法是我们选择所有具有颜色的产品并对每个产品进行计数,那么具有两种颜色的产品应该以 2 作为颜色数

DetachedCriteria colorCrit = DetachedCriteria.For(Product.class)
    .createAlias("colors","color")
    .add(Restriction.eq("color.color", "RED")
    .add(Restriction.eq("color.color", "GREEN")
    .SetProjection(Projections.Group("id"))
    .add(Restriction.eq(Projections.rowCount(), 2));

Criteria criteria = createCriteria()
    .add(Subqueries.in("id", colorCrit)
    .list();

更新:

有一个issue 用于休眠。最后一条评论描述了如何使用。

【讨论】:

  • 看起来不错,但还有其他方法吗?对于一个简单的搜索来说,这似乎太多了? =x 搜索功能仅接受标准列表,除非绝对必要,否则我不希望更改该功能。
  • 尝试提出一个执行此操作的 sql 查询,我很乐意将其转换为标准。如果您在颜色中有反向引用,那么您可以执行“subqueries.eq(colors.count(), subqueryWhereBackreferenceEqualThisAlias”
  • 有没有办法避免这种情况的子查询?我一直在尝试一整天,但我也无法避免使用子查询。
  • colorCrit >> 只是好奇,这是一个独立的查询,似乎是,但我只是想确认一下
  • 我想不出没有子查询的 sql 并且 colorCrit 是独立的
猜你喜欢
  • 2014-11-13
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多