当前位置: 首页 > 知识库问答 >
问题:

查询DSL中继日期

阎祖鹤
2023-03-14

我需要在查询之间使用querydsl只用于没有时间戳的日期比较。

查询DSL:

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
select * from employee where dob between trunc(start date) and trunc(end dat)

这将查找开始日期和结束日期之间没有时间戳的记录。我需要在QueryDSL中执行相同的瘦g。数据库为Oracle。

共有1个答案

乐正涵意
2023-03-14

不幸的是,date_trunc不是jpql中定义的函数,因此没有一个JPA实现(如Hibernate)支持该函数。

但是,date_trunc可以注册为各种JPA实现中的自定义函数,然后可以使用一组自定义的QueryDSL模板来包括对这些函数的处理。

例如,对于Hibernate:

public class DateTruncMetadataBuilderInitializer
        implements MetadataBuilderInitializer {
    @Override
    public void contribute(MetadataBuilder metadataBuilder,
            StandardServiceRegistry serviceRegistry) {
        metadataBuilder.applySqlFunction("DATE_TRUNC",
            new SQLFunctionTemplate(DateType.INSTANCE,
                "DATE_TRUNC(?1, ?2)"));
    }
}

然后需要在名为meta-inf/services/org.hibernate.boot.spi.metadatabuilderInitializer的JAR资源文件中注册该类。

经过此更改后,您可以在JPQL/HQL查询中使用date_trunc,如下所示:

sql prettyprint-override">SELECT a FROM Entity a 
    WHERE a.dateField BETWEEN DATE_TRUNC('day', :start) AND DATE_TRUNC('day', :end)

现在您必须使该函数对QueryDSL可用。您可以通过声明自定义模板来完成此操作:

public class MyTemplates extends JPQLTemplates {

    public MyTemplates() {
        add(DateTimeOps.TRUNC_DAY, "DATE_TRUNC('day', {0})");
    }

}

然后按如下方式使用:

new JPAQuery(entityManager, new MyTemplates()).from(entity)
    .select(Expressions.dateOperation(DateTimeOps.TRUNC_HOUR, dateExpression))

但是,由于Spring集成处于中间位置,我认为templates绑定到查询会更加困难。

或者,您可以查看blaze-persistence-querydsl扩展,它对JPQL中的日期/时间操作提供了开箱即用的支持。

 类似资料:
  • 主要内容:匹配所有查询,全文查询,匹配查询,multi_match查询,查询字符串查询,期限等级查询,范围查询,复合查询,连接查询,地理查询在Elasticsearch中,通过使用基于JSON的查询进行搜索。 查询由两个子句组成 - 叶查询子句 - 这些子句是匹配,项或范围的,它们在特定字段中查找特定值。 复合查询子句 - 这些查询是叶查询子句和其他复合查询的组合,用于提取所需的信息。 Elasticsearch支持大量查询。 查询从查询关键字开始,然后以对象的形式在其中包含条件和过滤器。以下描

  • 需要实现sql查询,如: 如何使用QueryDSL编写这样的语句?(我没有使用任何JPA)。任何帮助/提示都非常感谢!

  • 我知道我可以通过http://localhost:9200/[index_name]/[index_type]/[_id]更新特定的文档,但是我的文档中的_id有#个符号,Sense找不到它们。 了解查询DSL将能够执行一个搜索,我能够指出_id不在URL中。资源:https://www.elastic.co/guide/en/elasticsearch/reference/current/que

  • 我有4个实体: ,,, 和4个表: 现在我想在一个查询中选择所有有课程的用户(如果存在的话)(注意用户没有课程)这个select生成如下所示: 您可以清楚地看到,Hibernate没有与t_student_course表连接 我正在使用Hibernate 4.1 Final 问题:Hibernate支持这样的查询吗 a)如果支持,那么为什么它不为实体获取课程? b)如果不支持,我如何选择所有的用户

  • ES搜索中,可以通过GET /索引库名称/_doc/id查询文档,也可以通过 对文档进行查询 想问一下大佬们,这两者的区别是啥?都用在什么地方

  • 我的申请中有以下实体: 地址 在实体中: 在< code >广告实体中: 完整实体: 我想找到所有的家庭广告实例,其成员的地址在所需地址的20KM以内。 以下是我得出的结论: 但是,似乎我错误地使用了数字路径类,因为我不断得到一个NPE。任何人都可以帮我正确查询吗? 编辑:我已经改变了我的家庭广告实体如下: 我现在得到以下异常: 第64行是这样的: 任何线索现在出了什么问题? edit2:我忘了提