【问题标题】:Grails Criteria multiple hasMany intersectionGrails Criteria 多个 hasMany 交集
【发布时间】:2015-07-14 05:53:53
【问题描述】:

我一直在尝试使用多个 hasMany 对象进行查询,例如:

def product = Product.createCriteria().list {
  createAlias("productAttributeValues", "pav")    

  and {    

    if (session.filters?.filter_instore) {
        and {
          eq("pav.attribute", Attribute.findByCode("instore"))
          eq("pav.valueDe", session.filters?.filter_instore?.toString())
        }
    }

    if (session.filters?.filter_promo) {
      and {
        eq("pav.attribute", Attribute.findByCode("promo"))
        eq("pav.valueDe", "1")
      }
    }
  }    
}

这似乎不起作用,因为我从来没有得到结果集,尽管我有匹配的测试数据。看来问题是我用相同的对象查询了两次。

一种可能的解决方案是单独查询 productAttributeValues,然后与 "in"("myPavs", pavs) 相交 - 但这对我来说似乎效率低下。

有什么想法吗? 谢谢。

【问题讨论】:

  • Product.productAttributeValues (hasMany) 集合吗?
  • 是的,它是一个 hasMany 集合。

标签: grails grails-orm


【解决方案1】:

我会重新构建您的查询:

def products = Product.withCriteria{
  productAttributeValues{    
    or{
      if (session.filters?.filter_instore) {
        and {
          eq("attribute", Attribute.findByCode("instore"))
          eq("valueDe", session.filters?.filter_instore?.toString())
        }
      }

      if (session.filters?.filter_promo) {
        and {
          eq("attribute", Attribute.findByCode("promo"))
          eq("valueDe", "1")
       }
      }
    }
  }    
}

【讨论】:

  • 我想,这不起作用,因为属性和值是链接在一起的,因此必须保持在一起。在您的示例中,它是分开的。我错了吗?
  • 不,条件查询中的默认连接是and
  • 我的意思是属性和它的值(valueDe)是分开考虑的。以具有属性“R”和值“Bla”的 ProductAttributeValue1 和具有属性“B”和值“Ble”的 ProductAttributeValue2 为例。您的查询似乎只考虑了所有属性 R 和 B 以及 Bla 和 Ble。这可能会导致查询其他组合,例如可能存在的 Attribute 'R' 和 Vlue Ble?
  • 那么你应该将and-clauses 与or-conjunction 结合起来,查看更新
  • 谢谢,我会检查你的解决方案。同时,我想出了根据各自​​的过滤器 groupBy productId 列出 ProductAttributeValues 并通过 Groovy 进行交集的想法。像魅力一样工作。
猜你喜欢
  • 2011-05-14
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多