【问题标题】:oracle date field not evaluating in grails using java.Dateoracle 日期字段未在 grails 中使用 java.Date 进行评估
【发布时间】:2014-04-01 17:39:18
【问题描述】:

我有一个旧版 Oracle 表映射到 Grails 中的 Domain 类,如下所示:

class myDomain implements Serializable {

    String id
    String baseCountry
    Date expireDate

static constraints = {
}
static mapping = {
    version false
    autoTimestamp false
    datasource 'OraDataSource'
    table "MY_ACCOUNT"
    id column: "LICENSE_NUMBER", generator: "assigned"
    baseCountry column: "BASE_COUNTRY"
    expireDate column: "EXPIRE_DATE" NOTE:  This is an Oracle DATE type
}

我在 Grails 中设置了如下所示的日期:

def now = new Date()
def currentYear = now[YEAR]
def expireDateBegin  = new Date()
def expireDateEnd = new Date()

expireDateBegin[YEAR] = currentYear
expireDateBegin[MONTH] = DECEMBER
expireDateBegin[DATE] = 30

expireDateEnd[YEAR] = currentYear +1
expireDateEnd[MONTH] = JANUARY
expireDateEnd[DATE] = 01        

当我使用带有日期条件的动态查找器时,不会返回任何结果:

def iftaAccountInfo = 
    CTaxAccount.findByBaseCountryAndExpireDateBetween(
        country, 
        expireDateBegin, 
        expireDateEnd, 
        [max: 1, sort: "expireDate", order: "desc"])

如果我只使用国家/地区的动态查找器,我可以看到结果,并且在查看调试器时,日期被转换为时间戳。

当设置logSql = true 时,SQL 是正确的,但是当 GORM 在查询中设置日期时,日期出现了问题。我想不通。任何帮助将不胜感激。 我也尝试过使用Date().ClearTime() 清除时间。没有变化。

我正在运行 Grails 2.3.4、OJDBC7.jar 和 JDK 1.7_045。 Oracle 数据源设置为 ReadOnly,因为这是我用于查找的旧数据库。

【问题讨论】:

    标签: oracle grails grails-orm


    【解决方案1】:

    你有理由把日期分成几部分吗?我通常使用 SimpleDateFormat 类并操作从 params 对象接收到的字符串。

    import java.text.SimpleDateFormat
    
    def country = params.country
    String strExpireDateBegin, strExpireDateEnd
    
    //This is dependent on what values you're passing to your service.
    strExpireDateBegin = (params.startDate == null)?"":params.expireDateBegin
    strExpireDateEnd = (params.endDate == null)?"":params.expireDateEnd
    
    //This would be how I would generate the expiration date a year from the expireBeginDate
    Date expireDateBegin = new Date()
    Date expireDateEnd = expireDateBegin + 365
    
    
    ***use this for rendering the string into a Date***
    Date expireDateBegin, expireDateEnd
    expireDateBegin = new SimpleDateFormat("yyyy-MM-dd").parse(strExpireDateBegin)
    expireDateEnd = new SimpleDateFormat("yyyy-MM-dd").parse(strExpireDateEnd)
    
    ***results = MyCriteria.list {
      and {
          country = myCountry
      }
      between("expireDate", expireDateBegin, expireDateEnd)
      order("expireDate", "desc")
    }
    

    ***用于日期渲染的Bootstrap.groovy配置

    def init = { servletContext ->
        JSON.registerObjectMarshaller(Date) {
            return it?.format("yyyy-MMM-dd")
        }
    }
    

    【讨论】:

    • 我确定我试过了。我认为当它将字符串解析回日期时,它的时间为 00:00:00。不过我会试一试的
    • 日期的时间无关紧要,但如果您需要为 UI 目的格式化日期。您可以使用 Bootstrap.groovy 中的以下内容编辑返回的日期。我更新了我的答案,向您展示如何修改日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多