Я не совсем уверен, но я думаю, что это будет работать:
name(unique:['b', 'name'])
Глядя на код для уникального ограничения, кажется возможным. Ограничение определенно позволяет вам передать список вещей для сравнения уникальности. Это называет это уникальность группы. Затем при проверке он перебирает этот список. Посмотрите, начиная со строки 137 здесь: http://www.docjar.com/html/api/org/codehaus/groovy/grails/orm/hibernate/validation/UniqueConstraint.java.html
Код выглядит так:
if(shouldValidate) {
Criteria criteria = session.createCriteria( constraintOwningClass )
.add( Restrictions.eq( constraintPropertyName, propertyValue ) );
if( uniquenessGroup != null ) {
for( Iterator it = uniquenessGroup.iterator(); it.hasNext(); ) {
String propertyName = (String) it.next();
criteria.add(Restrictions.eq( propertyName,
GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(target, propertyName)));
}
}
return criteria.list();
}
Таким образом, это зависит от того, вызовет ли вызов GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue свойство в том же классе. Который, исходя из названия, кажется, что должен.
Мне любопытно узнать, работает ли он для вас.