【问题标题】:Database Oracle, Query Date String JPA Repository Crud Repository, Java 8数据库 Oracle,查询日期字符串 JPA 存储库 Crud 存储库,Java 8
【发布时间】:2019-06-28 21:56:30
【问题描述】:

注意:我不能放置一些私有代码(数据库或 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 设置范围时,它会带来结果。)。

在我看来,它应该产生符合日期范围的相同结果。

有什么问题?

【问题讨论】:

    标签: oracle jpa crud spring-repositories


    【解决方案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(字符串)作为第一个参数,但获取日期,然后根据本文档中解释的规则 see section: implicit conversion

    以下规则管理隐式数据类型转换
    ....
    ....
    当您使用带有数据参数的 SQL 函数或运算符时 类型不是它接受的类型,Oracle 将参数转换为 接受的数据类型。

    它使用TO_CHAR 函数进行从日期到字符串的隐式转换。

    此函数使用会话中的默认日期语言来格式化字符串,因此根据此设置,日期可能会转换为 12/15/5419-06-11 12:23 PMJUN 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

    【讨论】:

    • 感谢您的宝贵时间。问题是:当我使用 Date 设置范围时,它不会给我带来结果,而当我使用 String 设置范围时,它会带来结果。但它也没有显示任何格式或句子的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2021-04-06
    • 2018-08-10
    • 1970-01-01
    相关资源
    最近更新 更多