【问题标题】:Grails hasmany search for exact items of hasmanyGrails hasmany 搜索 hasmany 的确切项
【发布时间】:2016-04-01 15:10:31
【问题描述】:

我有两个 GORM 域类。一个是卡,卡上有很多购买。有什么方法可以搜索大于或等于某些购买的卡。这里可能是一个例子

我们有 4 张卡片:

Card1:橙、橙、苹果 Card2:苹果、橙子 Card3:橙色,橙色 Card4:苹果、苹果、橙子

假设我想搜索所有有 2 个或更多橙子的卡片。这样只会返回卡 1,3。根据购买名称进行搜索。

【问题讨论】:

  • 您可以使用子查询来做到这一点,请参阅文档中的DetachedCriteria

标签: database grails grails-orm


【解决方案1】:

假设您的域类是这样的......

class Card {
    static hasMany = [purchases: Purchase]
}

class Purchase {
    String name
}

你可以这样做:

def cards = Card.withCriteria {
    resultTransformer = org.hibernate.Criteria.DISTINCT_ROOT_ENTITY 

    sizeGe('purchases', 2)

    purchases {
        eq('name', 'orange')
    }
}

您可以使用sizeGe() 而不是使用子查询,它计算集合中的项目数 并查找大于或等于提供的数字的计数。

但是,将eq() 添加到查询中会导致结果由于分组而包含重复项。子查询不会有副作用。所以DISTICT_ROOT_ENTITY 结果转换器事后过滤掉重复项

您可以通过我的文章here了解更多关于条件查询的信息。

【讨论】:

  • 实际上,这看起来只需要其中一项购买为橙色。有没有办法我可以说其中至少有两个是橙色的?
  • 是的...这是一个复杂得多的问题。我已经多次回答过这个问题。我认为这是迄今为止我找到的最佳解决方案:stackoverflow.com/questions/32856121/…
  • 太棒了。这适用于获得多个相同的购买,但我仍然有一个问题。我尝试使用 executeQuery 两次,然后找到这两组的交集,以便用户可以指定多次购买,但是当我尝试执行 executeQuery 两次时,它会在我第二次尝试时返回第一次搜索。知道发生了什么吗?
  • 不是我的头顶。 Groovy 确实具有交叉功能,因此可以得到您想要的东西。和我一起使用 Grails Noob,我们会一起解决这个问题:emmanuelrosa.com
  • 我解决了。我进行了第一次搜索,然后调用了 search.intersect(second_search) 而不将其分配给搜索。感谢大家的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多