Nano Hash - криптовалюты, майнинг, программирование

Критерии "многие ко многим" с настраиваемым доменом таблицы соединения

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

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')
  }
}

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


  • Что вы собираетесь делать с результатом и какого размера вы ожидаете его получить? 15.07.2011
  • Я спрашиваю, потому что мне интересно, можно ли опрашивать UserRole и .collect{} пользователей. 15.07.2011
  • Результатов будет довольно мало. Однако есть и другие ассоциации, которые также необходимо запрашивать у пользователя напрямую. Другие ассоциации "многие ко многим", если это вообще возможно. 15.07.2011

Ответы:


1

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

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).

14.07.2011
  • Вы можете немного сократить этот первый, заменив }.collect { it.user } на }.user, так как результатом является список. 15.07.2011
  • Нужен ли мне }*.user, или }.user сам будет работать? Я никогда не видел, чтобы использовался последний синтаксис. 15.07.2011
  • @Burt - Кроме того, вы, вероятно, тот, кто спросит: будет ли projection во втором примере работать? Никогда не пробовал. Я сам устрою быструю проверку, если вы не знаете что ли. 15.07.2011
  • Спасибо, Роб. В этом есть смысл. Единственная проблема заключается в том, что некоторые другие критерии поиска исходят от других ассоциаций "многие ко многим". UserAddress, например. Если возможно построить критерии с помощью этой модели. Например, userrole == foo && useraddress.city == bar && firstName, как doo. 15.07.2011
  • @Rob - извините, я плохо разбираюсь в запросах критериев - я всегда использую HQL. Достаточно легко проверить :) 15.07.2011
  • @Burt - нп, я сам проведу тест. На самом деле мне это очень любопытно. 15.07.2011
  • @Rob Я пробовал ваш последний пример, но он не работает. Штопать! Хорошая мысль. Очень плохо. Я мог бы застрять либо при прямом возвращении к HQL (что отстой, потому что все условно), либо при выполнении нескольких запросов, а затем отбрасывании / объединении данных в коде (blech). 15.07.2011
  • Хорошо - я удалю тот; в основном это было просто предложение попробовать. Если бы это был я, я бы, вероятно, просто сделал первый, так как он прост и будет работать для небольшого количества пользователей (если вам не нужна подкачка страниц и вы можете позволить себе загрузить их всех в память). Это не самый элегантный способ, но он сработает. Позже вы можете сократить полученный список с помощью других запросов на сопоставление. Опять же, не самый красивый. Но 15 минут написания кода и пара циклов могут помочь вам лучше, чем потратить день на создание идеального запроса с критериями. 15.07.2011
  • @ Роб, да, я тоже об этом думаю. Спасибо. 15.07.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..