получать случайные записи в отношениях «многие ко многим» с namedQuery - PullRequest
0 голосов
/ 29 июня 2010

У меня есть отношение многие ко многим между двумя объектами с таблицей соединений. Мне нужно иметь возможность выбрать 5 случайных детей на основе данных о родителе и дате, исключая некоторые записи о детях. Я застрял. Есть идеи?

   Parent {
      static hasMany = [children: Child]
    }

    Child {
      Date dob
      static belongsTo = [Parent]
      static hasMany = [parents: Parent]

      static namedQueries {

        randomFiveChildrenBornAfter { parentid, dob, excludeChildren->

          qt 'dob', dob            
          parents {
            eq 'id',parentid
          }
          // not in(excludeChildren) ?? order by rand() ??
        } 
      } 
   }

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Это буквально отношения Родитель / Ребенок (как у людей)?Если это так, набор потомков, вероятно, будет очень маленьким, и я, вероятно, просто сделаю это в памяти, а не с помощью SQL-запроса.

parent.children
    .findAll { dob >= fiveYearsAgo }
    .sort { Math.random() }
    .with { it.size() >= 5 ? it.subList(0,5) : it }
0 голосов
/ 21 октября 2014

Лучший обходной путь, если вы хотите использовать метод withCriteria:

User.withCriteria{
eq 'name', 'joseph'
sqlRestriction " order by rand()"
}

Важно сказать, что когда-то (в зависимости от созданного запроса Criteria) необходимо добавить «1 = 1» в sqlRestriction, поскольку оно добавляет условие «и» в сгенерированный запрос. Поэтому, если у вас есть исключение sqle, используйте:

sqlRestriction " 1=1 order by rand()"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...