Squeak.ru - шаблоны программирования

База данных Oracle, строка даты запроса, репозиторий JPA, репозиторий Crud, Java 8

ПРИМЕЧАНИЕ. Я не могу добавить частный код (базу данных или 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";

Работает!

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

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

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

Вопрос:

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

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

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


Ответы:


1

Вы не написали, что это была за ошибка, так что я только предполагаю, что наиболее вероятная ошибка в данном случае:
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 преобразует аргумент в принятый тип данных.

он выполняет неявное преобразование даты в строку с помощью функции 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

29.06.2019
  • Спасибо за ваше время. Проблема в том, что когда я устанавливаю диапазон с помощью Date, он не дает мне результатов, тогда как когда я устанавливаю диапазон с помощью String, он дает. Но это также не показывает мне никакой ошибки формата или предложения. 02.07.2019
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...