注意::我无法放置一些私有代码(数据库或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
却失败了(
当我使用日期设置范围时,它不会带来结果,而当我使用字符串设置范围时,它会带来结果。
我认为它应该产生与日期范围一致的结果。
出什么问题了?
答案 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/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