我在grails中有一个域类,它有一个字符串类型的列。下面是域类结构。
class TravelRequestUpdates{
updatedAt sqlType:'varchar(40)'
String updatedAt
}
我将纪元日期存储在此列中。使用createCriteria我想在此列上检查长类型值,但我无法执行此操作。有没有办法可以将此列中的值存储为String,并仍然对存储的值执行Long类型操作。下面是我的标准的代码,我希望此表中存储的值表现为长类型。这些日期没有比较。
def criteriaObj = TravelRequestUpdates.createCriteria()
def travelToShow = criteriaObj.get{
@Formula("cast(updatedAt as NUMBER(20,0))")
long tempUpdatedAt
tr{
eq('id',g.id)
}
and{
between(tempUpdatedAt, startTimeReport.time, endTimeReport.time)
}
and{
newStatus{
eq('id',completedTravelsStatus.id)
}
}
}
我想生成如下所示的查询。以下查询给出了我想要的结果。
SELECT *
FROM travel_request_updates
WHERE tr_id = '439'
AND updated_at BETWEEN ('1478016321000') AND('1478189121000')
AND new_status_id = '4'
答案 0 :(得分:2)
很抱歉,我的评论无法解决,因为我认为这是您的输入范围。
有几个选项
在您的域类中启用Long的瞬态对象,将基础字符串转换为Long,以便:
class TravelRequestUpdates{
String updatedAt
Long myConversion
static transients = [ 'myConversion' ]
Long getMyConverion() {
return (this.updatedAt as Long)
}
}
将它写成类似HQL
的东西,并可能转换对象:
String query = "FROM travelRequestUpdates
WHERE tr_id = :myid
AND cast (updatedAt as Long) BETWEEN (:input1) AND(:input2)
AND newSatusId = :status"
def myParams=[status: '4', input1: 1478016321000L, input2: 1478189121000L, myId: 439L]
def myList = TravelRequestUpdates.execute(query,myParams,[readonly:true])
L
已将它们转换为Long值,如果您愿意,可以声明长值,或者如果所有这些都失败,您可以运行sql query directly。