База данных Oracle, строка запроса даты Репозиторий JPA Репозиторий Crud, Java 8 - PullRequest
1 голос
/ 29 июня 2019

ПРИМЕЧАНИЕ: Я не могу поместить приватный код (база данных или код Java).

У меня в базе данных

CREATE TABLE "SCHEMA"."ENTITY" 
(   
    "HCODFECREGISTR" DATE,
    ... BLABLA
)

Сущность

import java.util.Date;

public class Entity  implements java.io.Serializable {
     private Date hcodfecregistr;
     ....
}

В интерфейсе Repository используя

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;


public interface EntityRepository extends CrudRepository<Entity, Long>, 
        JpaRepository<Entity, Long> {

    public static final String USING_STRING
    = " SELECT enti FROM Entity enti WHERE "
    + " (enti.hcodfecregistr BETWEEN TO_DATE(:stringIni,'dd/MM/yyyy hh24:mi') AND TO_DATE(:stringEnd,'dd/MM/yyyy hh24:mi'))";

    @Query(value = USING_STRING)
    List<Object[]> getEntityUsingString(
        @Param("stringIni") String stringIni, @Param("stringEnd") String stringEnd);


    public static final String USING_DATE
    = " SELECT enti FROM Entity enti WHERE "
    + " (enti.hcodfecregistr BETWEEN :dateIni AND :dateIni) ";

    @Query(value = USING_DATE)
    List<Object[]> getEntityUsingDate(
        @Param("dateIni") Date dateIni, @Param("dateEnd") Date dateEnd);


}

Теперь я хочу выполнить запрос.

Date fecha = //some java.util.Date

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(fecha);

    calendar.set(Calendar.HOUR, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    Date dateIni = calendar.getTime();

    calendar.set(Calendar.HOUR, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    Date dateEnd = calendar.getTime();

    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    String stringIni = dateFormat.format(fecha) + " 00:00";
    String stringEnd = dateFormat.format(fecha) + " 23:59";

Works!

    List<Object[]> listaObjects = theRepository.getEntityUsingString(stringIni, stringEnd);

Fails! Это не дает мне результатов (но также не показывает никакой ошибки ).

    List<Object[]> listaObjects = theRepository.getEntityUsingDate(dateIni, dateEnd);

Вопрос:

Я хочу понять, почему при использовании того же fecha (java.util.Date) метод getEntityUsingString работает, но при использовании метода getEntityUsingDate не получается ( Когда я устанавливаю диапазон с помощью Date, он не дает мне результатов, тогда как когда я устанавливаю диапазон с помощью String, он дает.).

На мой взгляд, он должен давать тот же результат, который соответствует диапазону дат.

В чем проблема?

1 Ответ

0 голосов
/ 29 июня 2019

Вы не написали, что это была за ошибка, поэтому я думаю, что наиболее вероятная ошибка в этом случае:
ORA-01861: literal does not match format string.

Если этов этом случае причина в том, что вы передаете в запрос два значения тип даты :

Date dateIni = calendar.getTime();
.....
Date dateEnd = calendar.getTime();
.....
theRepository.getEntityUsingDate(dateIni, dateEnd);

эти значения связаны с этими параметрами :stringIni и :stringEnd

BETWEEN TO_DATE(:stringIni,'dd/MM/yyyy hh24:mi') AND TO_DATE(:stringEnd,'dd/MM/yyyy hh24:mi')

Поскольку TO_DATE (char, [format]) функции ожидают CHAR (строку) в качестве первого параметра, но получают дату, затем в соответствии с правилами, объясненными в этой документации см.раздел: неявное преобразование

Следующие правила управляют неявным преобразованием типов данных :
....
....
Когда выиспользуя функцию или оператор SQL с аргументом типа данных, отличным от того, который он принимает, Oracle преобразует аргумент в принятый тип данных.

он выполняет неявное преобразование даты в строку, используя *Функция 1032 * TO_CHAR .

Эта функция использует значение по умолчаниюязык из сеанса для форматирования строк, поэтому в зависимости от этих настроек дату можно преобразовать во что-то вроде 12/15/54, 19-06-11 12:23 PM, JUN 23, 2019 13:20 AM +01 и т. д.
Эта строка 12/15/54 затем передается в TO_DATE(:stringIni,'dd/MM/yyyy hh24:mi')и так как это ядро ​​не соответствует строке формата, выдается ошибка: ORA-01861: literal does not match format string

...