【问题标题】:hibernate criteria query for timestamp休眠条件查询时间戳
【发布时间】:2013-02-15 07:05:12
【问题描述】:

我有一个表,其中包含一列提交日期(没有时区的时间戳)。我需要列出表中具有特定日期作为提交日期的所有记录。但不要考虑数据库中的时间。我通过使用条件查询和休眠来检索记录。这里怎么忽略时间?

实际上,我从客户端传递了一个日期,并且必须检索与 submit_date 具有相同日期的记录。不过不用考虑时间。

    else if(extjsFilter.getField().equals("submittedDate")) {
                            String str_date=extjsFilter.getValue(); 
                            SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy");
                            SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
                            Date date2 = format1.parse(str_date);
                            String datenew = format2.format(date2);
                            Date date = (Date)format2.parse(datenew);

                            if(extjsFilter.getType().equals("date"))
                            {
                                if(extjsFilter.getComparison().equals("gt"))
                                {
                                    Filter postDateFilterGT = getSession().enableFilter("jobFilterPostDateGT");
                                    postDateFilterGT.setParameter("postDateFilterGT", date);
                                }
                                if(extjsFilter.getComparison().equals("lt"))
                                {
                                    Filter postDateFilterLT = getSession().enableFilter("jobFilterPostDateLT");
                                    postDateFilterLT.setParameter("postDateFilterLT", date);
                                }
                                if(extjsFilter.getComparison().equals("eq"))
                                {
                                    Filter postDateFilterEQ = getSession().enableFilter("jobFilterPostDateEQ");
                                    postDateFilterEQ.setParameter("postDateFilterEQ", date);
                                }
                            }
}

以上是我的代码。客户端使用 extjs 完成。 extjs过滤一个日期字段的服务器端代码是这样的。

下面给出了休眠。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiringsteps.ats.job.domain">
    <class
        name="Job"
        table="hs_job_master"> 

        <id name="id" column="job_id" unsaved-value="null">
            <generator class="sequence">
                <param name="sequence">hs_job_id_seq</param>
            </generator>
        </id>

        <property name="submittedDate" column="submitted_date"/>                

        <filter name="jobFilterPostDateGT"><![CDATA[submitted_date > :postDateFilterGT]]></filter>
        <filter name="jobFilterPostDateLT"><![CDATA[submitted_date < :postDateFilterLT]]></filter>
        <filter name="jobFilterPostDateEQ"><![CDATA[:postDateFilterEQ = submitted_date]]></filter>  
    </class>    

    <filter-def name="jobFilterPostDateGT">
        <filter-param name="postDateFilterGT" type="date"/>
    </filter-def>
    <filter-def name="jobFilterPostDateLT">
        <filter-param name="postDateFilterLT" type="date"/>
    </filter-def>
    <filter-def name="jobFilterPostDateEQ">
        <filter-param name="postDateFilterEQ" type="date"/>
    </filter-def>
</hibernate-mapping>

我在数据库中有两条记录,提交日期如下。

2013-02-15 00:00:00

2013-02-15 13:04:42.787

当我查询过滤日期为今天的记录时,第一条提交日期的记录 仅检索 2013-02-15 00:00:00。

这是因为我以前查询的日期对象,也有这个值 '2013-02-15 00:00:00'

如何进行忽略时间部分的查询?

【问题讨论】:

  • 你能解释一下'但不考虑数据库中的时间'是什么意思吗?
  • 你试过了吗。你的问题不清楚
  • 什么时间不用考虑?系统时间还是数据库时间?执行时间?
  • 再次更新问题
  • 我遇到了同样的问题,我必须解决它,找到给定日期的第二天并获取数据 GE startDate 和 LT endDate。

标签: java hibernate timestamp criteria


【解决方案1】:

为此,您必须应用一个限制,即选择提交日期和提交日期+1 之间的所有日期。

//Resticts the dates between start date 0000 hrs and end date 0000 hrs
criteria.add(Restrictions.ge("startDate", sDate)); 
criteria.add(Restrictions.lt("endDate", eDate));

在您的情况下,startDate = 2013-02-15 和结束日期 = 2013-02-16

【讨论】:

  • 我正在使用休眠过滤器。我将如何使用过滤器?
  • 我有同样的问题,我必须用同样的逻辑解决它找到第二天并获取记录 GE 'date' 和 LT 'nextdate'
【解决方案2】:

你可以试试下面的代码,它利用原生Oracletrunc函数在比较时丢弃时间。

criteria.add(Restrictions.sqlRestriction("trunc(submitted_date) = ?", submittedDate, org.hibernate.type.StandardBasicTypes.DATE));

您可以根据数据库提供者修改功能。

【讨论】:

    【解决方案3】:

    只需在您的条件中添加与提交日期对应的属性的限制。你可以写成

    criteria.add(Restrictions.eq("submittedDate"), '2013-02-15');
    

    【讨论】:

    • 日期参数应该是您想要比较时间的参数。
    • 我再次更新了问题。你能看看吗
    猜你喜欢
    • 2015-12-18
    • 2011-06-08
    • 2011-04-13
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多