Этот запрос вернет все ProductTypes, которые имеют обязательные атрибуты, с такими загруженными атрибутами:
def types = ProductType.executeQuery("""
select distinct type from ProductType type
left join fetch type.attributes attribute
where attribute.mandatory=true""")
Атрибуты находятся в отображенных наборах, поэтому упорядочения нет, но их достаточно просто собрать и отсортировать:
def sortedAttributes = types.collect { it.attributes }.flatten().sort { it.seq }