【问题标题】:java persistence with datesjava持久性与日期
【发布时间】:2017-05-28 12:23:45
【问题描述】:

我在 oracle 数据库中执行 orm 查询时遇到问题,当它的参数之一是日期字符串时

这是查询:

<named-native-query name="MyProject.QueryName"
    result-set-mapping="MyProject.QueryNameMapping">
    <query>
       <![CDATA[
          select 
            bnumber,
            to_timestamp(chargestart) as chargestart,
            reportedduration, 
            cost, 
            typeofcall
          from mydb@mytable t
          where t.answertime is not null
          and t.directorynumber = :mdn
          and to_date(substr(servicestart,1,17),'dd.mm.rr HH24:MI:SS') >= to_date(:startdate, 'dd.mm.rr HH24:MI:SS')
          and to_date(substr(servicestop,1,17), 'dd.mm.rr HH24:MI:SS') <  to_date(:todate,    'dd.mm.rr HH24:MI:SS')
          order by servicestart
       ]]>
    </query>
</named-native-query>

<sql-result-set-mapping name="MyProject.QueryNameMapping">
    <column-result name="bnumber"/>
    <column-result name="chargestart"/>
    <column-result name="reportedduration"/>
    <column-result name="cost"/>
    <column-result name="typeofcall"/>
</sql-result-set-mapping>

输入是

  • XMLGregorianCalendar 开始日期
  • XMLGregorianCalendar 结束日期
  • 字符串 mdn(这是一个电话号码)

这是我的代码:

EntityManager em = emf.createEntityManager();

List<Object[]> list = new ArrayList<Object[]>();

try{
    GregorianCalendar start = startDate.toGregorianCalendar();
    start.add(Calendar.HOUR_OF_DAY, -1); // because of timezone +1 
    GregorianCalendar end = endDate.toGregorianCalendar();
    end.add(Calendar.HOUR_OF_DAY, -1); // because of timezone +1

    list = ((Session) em.getDelegate()).getNamedQuery("HotelskoResenjeWS.vratiListingZaBroj")
                    .setParameter("mdn", account.getMdn())
                    .setParameter("startdate", (new SimpleDateFormat("dd.MM.yy HH:mm:ss").format(start.getTime() ) ))
                    .setParameter("todate", (   new SimpleDateFormat("dd.MM.yy HH:mm:ss").format(  end.getTime() ) ))
                    .list();
}catch (Exception e){
    e.printStackTrace();
    throw new RuntimeException(e);
}

下午 (12-23) 小时的输入值会出现问题。当我手动运行具有相同输入的查询时,我可以在数据库中看到它们,但是当我尝试通过 Java 代码检索它们时,它返回一个从数据库读取的空对象列表。

为了增加混乱,该代码适用于中午前几个小时的输入值。 (00-12)

请帮忙。

【问题讨论】:

  • 嗯?你有 JPA 命名查询,然后抛弃可移植性并侵入 Hibernate API 调用?
  • 不幸的是,是的。当我尝试通过读取数据库行来使用 JPA 时,我得到的日期都将其时间设置为 00:00:00,这对每个人来说都是错误的。我为此苦苦思考了一个星期,这是唯一解决的问题。
  • 这是您查看 LOG 并查看调用的 SQL 的位置。也许你这样做了,但最终结果应该是在你的 JPA 提供者上引发了一个错误......
  • 我做了所有这些事情。还没有回复。

标签: java oracle hibernate jpa


【解决方案1】:

您为什么不简单地将日历实例作为参数传递并按原样使用它们,而无需在查询本身中使用该格式:

and to_date(substr(servicestart,1,17),'dd.mm.rr HH24:MI:SS') >= :startdate
and to_date(substr(servicestop,1,17), 'dd.mm.rr HH24:MI:SS') <  :todate

还有java部分:

list = ((Session) em.getDelegate()).getNamedQuery("HotelskoResenjeWS.vratiListingZaBroj")
                    .setParameter("mdn", account.getMdn())
                    .setParameter("startdate", start, TemporalType.TIMESTAMP)
                    .setParameter("todate", end, TemporalType.TIMESTAMP)
                    .list();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2011-04-21
    相关资源
    最近更新 更多