有没有办法将这个HQL转换为Criteria?

问题描述:

这是在HQL,我想转换:有没有办法将这个HQL转换为Criteria?

UserRequest.executeQuery("Select ur.request from UserRequest ur 
    where ur.user = :user and ur.request.type is null 
    order by ur.request.dateCreated DESC", 
[user: user], 
[max: params.max?: 10, offset: params.offset?: 0]) 

我想它与下面的代码转换为criteria,但它给了我一个错误,No property request.type found

def list = UserRequest.createCriteria().list(max: params.max?: 10, offset: params.offset?: 0) { 
    eq("user", user) 
    isNull(request.type) 
    order("request.dateCreated", "DESC") 
} 

动机转化

除了必须编写一个单独的查询来获得总分(用于分页)使用HQL时我想转换的另一个原因它到标准是因为我需要根据参数筛选此查询的结果。例如:

def list = UserRequest.createCriteria().list(max: params.max?: 10, offset: params.offset?: 0) { 
    eq("user", user) 
    isNull("request.type") 

    if (params.filtertype == "color") 
     ilike("request.color", "%${params.filtervalue}%") 
    order("request.dateCreated", "DESC") 
} 

如果我尝试使用HQL来完成上述操作,则会变得更麻烦。

更新

这里是我的阶级结构

class User { 
    transient springSecurityService 
    String username 
    String password 
} 

Class Request { 
    String type 
} 

class UserRequest implements Serializable{ 
    User user 
    Request request 

    static mapping = { 
     id composite: ['user', 'request'] 
     version false 
    } 

    //equals & hashcode 

    static UserRequest create (User user, Request request, boolean flush = true) { 
     def d = new UserRequest (user: user, request: request) 
       d.save(flush: flush, insert: true) 
    } 
} 

由于您的条件查询涉及的关联,请尝试以下操作:

def list = UserRequest.createCriteria().list(max: params.max?: 10, offset: params.offset?: 0) { 
    eq("user", user) 
    request { 
     isNull("type") 
     order("dateCreated", "DESC") 
    } 
} 

还有就是使用createAlias()语法变化。根据查询的最终结构,您可能会发现更容易使用。有关更多示例,请参阅此处的“查询关联”部分:http://grails.org/doc/latest/guide/GORM.html#criteria