The filterMany() actually requires a separate SQL query and that means it should always be executed on a +query join really.
Ebean should automatically convert the join to be a +query join, otherwise it will end up as a filter on the root level (which is not the expected/documented behaviour).
List<Customer> list = Ebean.find(Customer.class) .select("id, name, status, shippingAddress") .fetch("contacts", "firstName,email")//, new FetchConfig().query()) .filterMany("contacts").ilike("firstName", "J%").query() .order().desc("id") .findList();
So Ebean will automatically add the FetchConfig.query() to the "contacts" fetch path due to the filterMany being applied to that path.
ie. Currently you need to manually define the new FetchConfig().query()... and if you don't it will effectively filter the root level beans.
Fixed in HEAD.
Ebean will automatically add +query(100) +lazy(100) to a fetch path that has filterMany on it.