Spring QueryDSL trunc日期
我需要在查询之间使用querydsl,只用于不带时间戳的日期比较 QueryDsl:Spring QueryDSL trunc日期,spring,querydsl,Spring,Querydsl,我需要在查询之间使用querydsl,只用于不带时间戳的日期比较 QueryDsl: Date startDate= Date endDate= QEmp qEmp= BooleanExpression empExp = qEmp.id.dob.between(startDate, endDate); 表: select dob from employee where eid=2; 10-MAR-07 12.00.00.000000000 AM dob之间的SQL查询: select *
Date startDate=
Date endDate=
QEmp qEmp=
BooleanExpression empExp = qEmp.id.dob.between(startDate, endDate);
表:
select dob from employee where eid=2;
10-MAR-07 12.00.00.000000000 AM
dob之间的SQL查询:
select * from employee where dob between trunc(start date) and trunc(end dat)
这将查找开始日期和结束日期之间没有时间戳的记录。我需要在QueryDSl中执行相同的瘦g。数据库是Oracle。不幸的是,
DATE\u TRUNC
不是JPQL
中定义的函数,因此,没有一个JPA实现(如Hibernate)支持此函数
DATE\u TRUNC
可以在各种JPA实现中注册为自定义函数,然后您可以使用一组自定义的QueryDSL模板来包含对这些函数的处理
例如,对于Hibernate:
公共类DateTruncMetadataBuilderInitializer
实现MetadataBuilderInitializer{
@凌驾
public void贡献(MetadataBuilder MetadataBuilder,
标准服务注册中心(serviceRegistry){
metadataBuilder.applysqlnc函数(“日期”,
新的SQLFunctionTemplate(DateType.INSTANCE,
“日期(1,2)”;
}
}
然后需要在名为META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer
的JAR资源文件中注册此类
更改后,您可以在JPQL/HQL查询中使用DATE\u TRUNC
,如下所示:
从实体a中选择一个
其中a.DATE字段介于日期(“day”,:开始)和日期(“day”,:结束)之间
现在您必须使此函数可用于QueryDSL。您可以通过声明自定义模板来执行此操作:
公共类MyTemplates扩展了JPQLTemplates{
公共MyTemplates(){
添加(DateTimeOps.TRUNC_DAY,“DATE_TRUNC('DAY',{0})”;
}
}
然后按如下方式使用:
new-JPAQuery(entityManager,new-MyTemplates())。来自(实体)
.select(Expressions.dateOperation(DateTimeOps.TRUNC_HOUR,dateExpression))
使用中间的Spring集成,但是<>代码>模板>代码>与我想的查询比较困难。
或者,您可以研究扩展,它在JPQL中对日期/时间操作提供了现成的支持