【发布时间】: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 提供者上引发了一个错误......
-
我做了所有这些事情。还没有回复。