Grails - findAll Посты, созданные сегодня пользователем - PullRequest
5 голосов
/ 23 июня 2011

У меня есть объект домена.

class Post {
  User user
  String subject
  String body
  Date dateCreated
}

Как мне это сделать? Является ли прямой GORM, HQL или критерии лучшим способом? Я не знал, какие манипуляции с датами («сегодня eq») будут работать в критериях.

Ответы [ 5 ]

9 голосов
/ 24 июня 2011

Я бы, вероятно, сделал именованный запрос

class Post {
  User user
  String subject
  String body
  Date dateCreated

     static namedQueries = {
       todaysPosts {
          def now = new Date().clearTime()
          between('dateCreated', now, now+1)
       }
   }
}

Тогда вы можете использовать его как:

Post.todaysPosts.count()

или

Post.todaysPosts.list()
Post.todaysPosts.list(max: 10, offset: 5)

, который вы можете даже сделать

Post.todaysPosts.findAllByUser(user)

Здесь больше по именованным запросам

4 голосов
/ 24 июня 2011

Вот пример критерия:

// assuming future posts are disallowed
def posts = Post.withCriteria {
    eq('user', user)
    ge('dateCreated', new Date().clearTime())
}

// if you must accommodate future posts
def today = new Date().clearTime()
def posts = Post.withCriteria {
    eq('user', user)
    ge('dateCreated', today)
    lt('dateCreated', today.plus(1))
}
3 голосов
/ 23 июня 2011

Я бы использовал Grails Dynamic Finders для этого:

Post.findAllByUserAndDateCreatedGreaterThanEquals(currentUser, new Date().clearTime())

Где "currentUser" - это экземпляр текущего пользователя

0 голосов
/ 24 июня 2011

Для полноты изложения этот запрос написан на HQL:

def yourUser = User.get(1)
def results = Post.executeQuery( "select * from Post a where a.user = :user and a.dateCreated >= :dateCreated", [user : yourUser , dateCreated : new Date().clearTime()] );

@ Tyndall: на этот вопрос есть много ответов, просто выберите тот, который вам удобнее.

0 голосов
/ 23 июня 2011
String sqlQuery = "SELECT * FROM Post p WHERE p.dateCreated  = NOW()"
def e = Post.executeQuery(sqlQuery)
...