[Grails] 求助,关于一个"取最后一个对象"的查询方法。

zengsun 2007-07-13
我对hibernate不熟悉!
所以不知道怎么写HQL语句。
sql语句是很简单的(以sql server为例):
select top 1 * from topic order by createDate desc

这样就把topic最后一个对象查找出来了,但是这个查询在grails如何实现呢?
agile_boy 2007-07-13
不知道你对Hibernate的Cirteria熟悉么?Grais对其进行了简洁的封装,在用法上更方便。
详细请看http://grails.codehaus.org/Hibernate+Criteria+Builder
zengsun 2007-07-13
看了半天,没有还是不知道怎么写。可以写出来看看吗?
zengsun 2007-07-15
自己写了一个:
    static def lastTopic(category) {
        def c = Topic.createCriteria()
        def result = c.list {
            maxResults(1)
            eq('category.id', category.id)
            order('createDate', 'desc')        
        }
        if (result)
            return result[0]
    }

我把这段代码作为静态方法放在控制器中,这样是否得当?
zengsun 2007-07-15
处理业务逻辑的代码放在什么地方好些?
agile_boy 2007-07-16
zengsun 写道
处理业务逻辑的代码放在什么地方好些?

复杂的业务逻辑当然实在Service里边,而有些本身属于领域的业务逻辑最好放到Domain对象中。
agile_boy 2007-07-16
zengsun 写道
自己写了一个:
    static def lastTopic(category) {
        def c = Topic.createCriteria()
        def result = c.list {
            maxResults(1)
            eq('category.id', category.id)
            order('createDate', 'desc')        
        }
        if (result)
            return result[0]
    }

我把这段代码作为静态方法放在控制器中,这样是否得当?


我个人不推荐使用静态方法,最好放到Service里边,然后在Controller里边引用Service
山风小子 2007-07-16
同意agile_boy的做法,这样也可以减少代码的冗余。
还有一点,如果你使用了static就没必要再使用def了,只要像下面这样写就OK了
# static lastTopic(category) { 
#     def c = Topic.createCriteria() 
#     def result = c.list { 
#         maxResults(1) 
#         eq('category.id', category.id) 
#         order('createDate', 'desc')         
#     } 
#     if (result) 
#         return result[0] 
# }
Global site tag (gtag.js) - Google Analytics