Hibernate 有没有办法将此HQL转换为标准?
这是我试图转换的HQL:Hibernate 有没有办法将此HQL转换为标准?,hibernate,grails,hql,hibernate-criteria,Hibernate,Grails,Hql,Hibernate Criteria,这是我试图转换的HQL: 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]) 我尝试用下面的代码将其转
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])
我尝试用下面的代码将其转换为标准
,但它给了我一个错误,没有属性请求。找到类型
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()
。根据查询的最终结构,您可能会发现这更容易处理。有关更多示例,请参见此处的“查询关联”部分: