Cast String Column to Long grails createCriteria

时间:2016-11-03 16:29:31

标签: hibernate grails gorm hibernate-criteria

我在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'

1 个答案:

答案 0 :(得分:2)

很抱歉,我的评论无法解决,因为我认为这是您的输入范围。

有几个选项

  1. 在您的域类中启用Long的瞬态对象,将基础字符串转换为Long,以便:

    class TravelRequestUpdates{
     String updatedAt
     Long myConversion
    
     static transients = [ 'myConversion' ]
    
    
     Long getMyConverion() {
      return (this.updatedAt as Long)
     }
    }
    
  2. 将它写成类似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])
    
  3. L已将它们转换为Long值,如果您愿意,可以声明长值,或者如果所有这些都失败,您可以运行sql query directly