I have a hierarchy of objects, Order, Contact, Address:
public class Order { public virtual Contact BillingContact { get; set; } } public class Contact
I believe you might need to add an alias to BillingContact to allow you access to it's Address.
Something like:
var criteria = DetachedCriteria.For<Order>() .CreateAlias("BillingContact", "bc") .SetFetchMode("BillingContact", FetchMode.Eager) .SetFetchMode("bc.Address", FetchMode.Eager)