我想在findAll查询中集成sort,order,max和offset。以下工作正常:
def books = Book.findAll("from Book as b where b.approved=true order by b.dateCreated desc", [max: max, offset: offset])
但我想要的是:
def books = Book.findAll("from Book as b where b.approved=true", [sort: 'dateCreated', order: 'desc', max: max, offset: offset])
这不起作用。我该怎么重写呢?
答案 0 :(得分:7)
HQL不支持排序和顺序作为参数,因此您需要在“HQL表达式”中包含“order by”
def books = Book.findAll("from Book as b where b.approved=true"
+ " order by b.dateCreated desc", [max: max, offset: offset])
(或者在这种情况下只使用Book.findAllByApproved(true, [...])
而不是HQL)。
因此,如果排序和顺序是变量,则需要像
这样的技巧def books = Book.findAll("from Book as b where b.approved=true"
+ (params.sort ? " order by b.${params.sort} ${params.order}" : ''),
[max: max, offset: offset])
答案 1 :(得分:6)
使用where查询对我有用:
def books = Book.where{approved == true}.list(sort: 'dateCreated', order: 'desc', max: max, offset: offset)
或者从页面直接使用params:
def books = Book.where{approved == true}.list(params)
答案 2 :(得分:1)
使用" findAllBy"因为它支持排序和订单。
def results = Book.findAllByTitle("The Shining",
[max: 10, sort: "title", order: "desc", offset: 100])
点击here了解详情。
答案 3 :(得分:0)
我假设您正在调用获取控制器或服务类中的书籍列表。
如果你是通过控制器动作调用它,那么一个神奇的变量" params"已经可以使用了。 例如,如果您按如下方式请求页面
book/list?max=10&offset=2
然后" params"将自动映射这些值。
您可以在params地图中添加更多项目,如下所示
params.sort = "dateCreated"
params.order = "desc"
根据需要构建params之后,您可以使用Grails动态查询,如下所示
def books = Book.findAllByApproved(true, params)
// use "books" variable as you wish