数据库Oracle,查询日期字符串JPA存储库Crud存储库,Java 8

时间:2019-06-28 21:56:30

标签: oracle jpa crud spring-repositories

注意::我无法放置一些私有代码(数据库或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却失败了( 当我使用日期设置范围时,它不会带来结果,而当我使用字符串设置范围时,它会带来结果。

我认为它应该产生与日期范围一致的结果。

出什么问题了?

1 个答案:

答案 0 :(得分:0)

您没有写出什么错误,所以仅是我的猜测,这种情况下最可能的错误是:
 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