sullivan
sullivan

Reputation: 360

Grails Criteria multiple hasMany intersection

I've been trying to query with multiple hasMany objects, such as:

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")
      }
    }
  }    
}

This doesn't seem to work, since I never get a result set, although I have test data that would match. It seems that the problem is that I'm querying twice with the same objects.

One possible solution would be to query the productAttributeValues seperately and then intersect with a "in"("myPavs", pavs) - but this seems to be inefficient to me.

Any thoughts? Thanks.

Upvotes: 0

Views: 417

Answers (1)

injecteer
injecteer

Reputation: 20699

I would re-build your query so:

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")
       }
      }
    }
  }    
}

Upvotes: 1

Related Questions