Критерии «многие ко многим» с настраиваемым доменом таблицы соединений - PullRequest
1 голос
/ 14 июля 2011

Учитывая следующие примеры доменов:

class UserRole implements Serializable {
  User user
  Role role
}

class User { 
  Set<Role> getRoles() {
    UserRole.findAllByUser(this).collect { it.role } as Set
  } 
}

class Role { 
  Set<User> getUsers() {
    UserRole.findAllByRole(this).collect { it.user } as Set
}

Я не могу понять, как построить критерии для поиска всех пользователей с данной ролью.Я попытался сделать следующее:

def crit = User.createCriteria()
def results = crit.list {
  roles {
    eq('authority', 'ROLE_ADMIN')
  }
}

Однако он говорит, что не может найти свойство 'role' в User.Причина, по которой мне нужны критерии, заключается в том, что в пользовательском поиске будут дополнительные свойства, поэтому динамические искатели не будут работать в этой ситуации.

1 Ответ

3 голосов
/ 15 июля 2011

Если ожидаемый результат небольшой, возможно, достаточно просто сделать это:

def c = UserRole.createCriteria()
def users = c.list {
    role {
        eq('authority', 'ROLE_ADMIN')
    }
    user {
        // additional user property constraints
    }
}.collect { it.user }

Если вы ожидаете большой набор результатов или вам нужно перелистывать их, я не уверен в этом. Я брошу это там, но я никогда не пробовал это. Я не знаю, можно ли использовать projections { property('association') } и заставить его работать.

def c = UserRole.createCriteria()
def users = c.list {
    projections {
        property('user') // never tried this, but worth a shot
    }
    role {
        eq('authority', 'ROLE_ADMIN')
    }
    user {
        // additional user property constraints
    }
}

Я не думаю, что то, что вы пытаетесь сделать в вашем примере, сработает, так как на самом деле у вас нет определенных отношений в ваших User или Role классах, которые ссылаются на UserRole (т.е. с hasMany).

...