您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何建立一个动态查询,该查询增加了迄今为止的天数,并使用标准API比较该日期与另一个日期?

如何建立一个动态查询,该查询增加了迄今为止的天数,并使用标准API比较该日期与另一个日期?

您可以使用CriteriaBuilder#function()执行要添加days到中的数据库函数retentionDate。我已经使用DATEADD()制作了一个示例,因为我的测试项目使用H2数据库运行。

    ParameterExpression<String> dayUnit = builder.parameter(String.class, "dayUnit");
    Expression<DateTime> newDate = builder.function("DATEADD", DateTime.class, dayUnit, days, retentionDate);

完整的示例:

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<B> cq = builder.createQuery(B.class);
    Root<B> fromB = cq.from(B.class);

    Expression<DateTime> lastmodifiedDate = fromB.get(B_.lastmodifiedDate);
    Expression<DateTime> retentionDate = fromB.get(B_.a).get("retentionDate");
    Expression<Integer> days = fromB.get(B_.a).get("days");

    ParameterExpression<String> dayUnit = builder.parameter(String.class, "dayUnit");
    Expression<DateTime> newDate = builder.function("DATEADD", DateTime.class, dayUnit, days, retentionDate);

    cq.where(builder.greaterThanOrEqualTo(newDate, lastmodifiedDate));

    TypedQuery<B> tq = entityManager.createQuery(cq.select(fromB));
    tq.setParameter("dayUnit", "DAY");
    List<B> results = tq.getResultList();

查询将转换为sql,如下所示:

select 
    b0_.id as id1_1_, 
    b0_.a_id as a_id3_1_, 
    b0_.lastmodified_date as lastmodi2_1_ 
from b b0_ 
    cross join a a1_ 
where b0_.a_id=a1_.id 
    and DATEADD(?, a1_.days, a1_.retention_date)>=b0_.lastmodified_date
其他 2022/1/1 18:13:32 有981人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶