2016-03-07 5 views
0

Я пытаюсь найти результаты в базе данных postgresql между двумя датами (поле, описанное в ddbb как timestamp).Сравнение дат в jpa

У меня есть эти три записей, которые должны соответствовать целям: 2016-03-04 00:00:00 2016-03-04 14:00:00 2016-03-04 10:56:00

final Calendar fechaMinima = Calendar.getInstance(); 

и установите параметры, которые я хочу.

JPA столбец определяется:

@Column(name = "tim_ofrecim") 
@NotNull 
@Temporal(TemporalType.TIMESTAMP) 
@DateTimeFormat(style = "M-") 
private Date Tewslofr.timOfrecim; 

С JPA Я пытаюсь найти их с помощью следующего кода:

@NamedQuery(name = "ofr_query2", query = "SELECT COUNT (*) FROM Tewslofr ofr " 
       + "WHERE ofr.id.codIdprodto =:codIdprodto " 
       + "AND ofr.codUser =:codUser " 
       + "AND ofr.timOfrecim BETWEEN :timMinimo AND :timMaximo") 

public static Long getMethod(final String codProducto, 
      final String codUser, final Calendar fechaMinima, 
      final Calendar fechaMaxima) { 

    return entityManager().createNamedQuery("ofr_query2", Long.class) 
      .setParameter("codIdprodto", codProducto) 
      .setParameter("codUser", codUser) 
      .setParameter("timMinimo", fechaMinima, TemporalType.TIMESTAMP) 
      .setParameter("timMaximo", fechaMaxima, TemporalType.TIMESTAMP) 
      .getSingleResult(); 
} 

и получить это исключение:

вызвано следующими причинами: java.lang.IllegalArgumentException: значение параметра [java.util.GregorianCalendar [time = ?, areFieldsSet = false, areAllFieldsSet = true, lenient = true, zone = s un.util.calendar.ZoneInfo [ID = "Европа/Париж", смещение = 3600000, dstSavings = 3600000, useDaylight = верно, переходы = 184, lastRule = java.util.SimpleTimeZone [ID = Europe/Paris, смещение = 3600000, dstSavings = 3600000, useDaylight = верно, StartYear = 0, StartMode = 2, StartMonth = 2, startDay = -1, startDayOfWeek = 1, = 3600000 начальный промежуток, startTimeMode = 2, endMode = 2, endMonth = 9, endDay = -1, endDayOfWeek = 1, EndTime = 3600000, endTimeMode = 2]], firstDayOfWeek = 2, minimalDaysInFirstWeek = 4, ERA = 1, ГОД = 2016, МЕСЯЦ = 2, WEEK_OF_YEAR = 10, WEEK_OF_MONTH = 2, DAY_OF_MONTH = 1, day_of_year = 67, DAY_OF_WEEK = 2, DAY_OF_WEEK_IN_MONTH = 1, AM_PM = 0, HOUR = 8, HOUR_OF_DAY = 0, MINUTE = 0, SECOND = 0, MILLISECOND = 434, ZONE_OFFSET = 3600000, DST_OFFSET = 0]] не соответствует типу [java.util. Дата]

стек трассировки это:

org.springframework.dao.InvalidDataAccessApiUsageException: значение параметра [java.util.GregorianCalendar [time = ?, areFieldsSet = false, areAllFieldsSet = true, lenient = true, zone = sun.util.calendar.ZoneInfo [id = "Europe /Paris",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0, StartMode = 2, StartMonth = 2, startDay = -1, startDayOfWeek = 1, = 3600000 начальный промежуток, startTimeMode = 2, endMode = 2, endMonth = 9, endDay = -1, endDayOfWeek = 1, EndTime = 3600000, endTimeMode = 2] ], firstDayOfWeek = 2, minimalDaysInFirstWeek = 4, ERA = 1, ГОД = 2016, МЕСЯЦ = 2, WEEK_OF_YEAR = 10, WEEK_OF_MONTH = 2, DAY_OF_MONTH = 1, day_of_year = 67, DAY_OF_WEEK = 2, DAY_OF_WEEK_IN_MONTH = 1, AM_PM = 0, HOUR = 9, HOUR_OF_DAY = 0, MINUTE = 0, SECOND = 0, MILLISECOND = 170, ZONE_OFFSET = 3600000, DST_OFFSET = 0]] не соответствует типу [java.util.Date]; Вложенное исключение - это java.lang.IllegalArgumentException: значение параметра [java.util.GregorianCalendar [time = ?, areFieldsSet = false, areAllFieldsSet = true, lenient = true, zone = sun.util.calendar.ZoneInfo [id = "Европа/Париж », смещение = 3600000, dstSavings = 3600000, useDaylight = верно, переходы = 184, lastRule = java.util.SimpleTimeZone [ID = Европа/Париж, смещение = 3600000, dstSavings = 3600000, useDaylight = верно, StartYear = 0, StartMode = 2, StartMonth = 2, startDay = -1, startDayOfWeek = 1, = 3600000 начальный промежуток, startTimeMode = 2, endMode = 2, endMonth = 9, endDay = -1, endDayOfWeek = 1, EndTime = 3600000, endTimeMode = 2]], firstDayOfWeek = 2, minimalDaysInFirstWeek = 4, ERA = 1, ГОД = 2016, МЕСЯЦ = 2, WEEK_OF_YEAR = 10, WEEK_OF_MONTH = 2, DAY_OF_MONTH = 1, day_of_year = 67, DAY_OF_WEEK = 2, DAY_OF_WEEK_IN_MONTH = 1, AM_PM = 0, ЧАС = 9, HOUR_OF_DAY = 0, MINUTE = 0, SECOND = 0, MILLISECOND = 170, ZONE_OFFSET = 3600000, DST_OFFSET = 0]] не соответствует типу [java.util.Date] на org.springframework.orm.jpa.EntityManagerFactoryUtils. convertJpaAccessExceptionIfPossible (EntityManagerFa ctoryUtils.java:301) at org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc $ afterTrowing $ org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspect $ 1 $ 18a1ac9 (JpaExceptionTranslatorAspect.aj: 15) at com.bbva.arq.front.spring.ewsl.ofrecimientos.api.v1.domain.Tewslofr.getCuentaOfrecimientosAgente_aroundBody2 (Tewslofr.java:49) at com.bbva.arq.front.spring.ewsl. ofrecimientos.api.v1.domain.Tewslofr.getCuentaOfrecimientosAgente (Tewslofr.java:1) at com.bbva.arq.front.spring.ewsl.ofrecimientos.api.v1.daos.ofrecimientos.impl.OfrecimientosDAOImpl.getMethod (OfrecimientosDAOImpl. java: 52) ... Вызвано: java.lang.IllegalArgumentException: Значение параметра [java.util.GregorianCalendar [time = ?, areFieldsSet = false, areAllFieldsSet = true, lenient = true, zone = sun.util.calendar. ZoneInfo [ID = "Европа/Париж", смещение = 3600000, dstSavings = 3600000, useDaylight = верно, переходы = 184, lastRule = java.util.SimpleTimeZone [ID = Europe/Paris, смещение = 3600000, dstSavings = 3600000, useDaylight = правда, StartYear = 0, StartMode = 2, StartMonth = 2, startDay = -1, startDayOfWeek = 1, = 3600000 начальный промежуток, startTimeMode = 2, ан DMODE = 2, endMonth = 9, endDay = -1, endDayOfWeek = 1, EndTime = 3600000, endTimeMode = 2]], firstDayOfWeek = 2, minimalDaysInFirstWeek = 4, ERA = 1, год = 2016, МЕСЯЦ = 2, WEEK_OF_YEAR = 10 , WEEK_OF_MONTH = 2, DAY_OF_MONTH = 1, day_of_year = 67, DAY_OF_WEEK = 2, DAY_OF_WEEK_IN_MONTH = 1, AM_PM = 0, ЧАС = 9, HOUR_OF_DAY = 0, МИНУТНЫЙ = 0, ВТОРОЙ = 0, миллисекунды = 170, ZONE_OFFSET = 3600000, DST_OFFSET = 0]] не соответствует типу [java.util.Date] at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding (AbstractQueryImpl.java:360) at org.hibernate.ejb.QueryImpl.setParameter (QueryImpl.java:414)

Если я изменяю DATE вместо TIMESTAMP:

public static Long getMethod(final String codProducto, 
      final String codUser, final Calendar fechaMinima, 
      final Calendar fechaMaxima) { 

    return entityManager().createNamedQuery("ofr_query2", Long.class) 
      .setParameter("codIdprodto", codProducto) 
      .setParameter("codUser", codUser) 
      .setParameter("timMinimo", fechaMinima.getTime(), TemporalType.DATE) 
      .setParameter("timMaximo", fechaMaxima.getTime(), TemporalType.DATE) 
      .getSingleResult(); 
} 

код возвращает 0.

Любая помощь будет оценена по достоинству.

сердечный привет

+0

Можете ли вы получить весь стек? У меня такое чувство, что исключение вызывается методом .getTime(), а не JPA – maslan

+0

Я редактировал сообщение с помощью stacktrace – Marta

ответ

0

Я до сих пор не знаю, почему первый вариант не работает, но я сделал его работу с опцией Date. Этот параметр был верным, но возвращал 0 из-за codIdprodto, а не из-за дат.