使用 JPA 标准 API 进行日期比较

2024-05-14

我有一个包含两个日期的范围日期选择器:start and end,其中两者都可以为空。我想过滤一张表,其中实体具有确切的一个日期:date.

所以,这里有一些例子。我愿意匹配。想象要匹配的日期是当前日期 (17/07/2016)。

  • 空 - 17/07/2016 -> 匹配
  • 17/07/2016 - 空 -> 匹配
  • 17/07/2016 - 17/07/2016 -> 比赛
  • null - null -> 匹配所有

在我看来,这些都是边缘情况,也是我如此挣扎的原因。

实际上我的代码看起来像:

CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Transaction> cq = cb.createQuery(Transaction.class);
Root<Transaction> root = cq.from(Transaction.class);

List<Predicate> predicates = new ArrayList<>();

Predicate startPredicate = cb.greaterThanOrEqualTo(root.get(Transaction_.date), start);
Predicate endPredicate = cb.greaterThanOrEqualTo(root.get(Transaction_.date), end);

predicates.add(startPredicate);
predicates.add(endPredicate);
cq.select(root).where(predicates.toArray(new Predicate[] {}));

TypedQuery<Transaction> query = getEm().createQuery(cq);
query.setFirstResult(firstRow);
query.setMaxResults(maxRow);
List<Transaction> resultList = query.getResultList();

我想得到这样的查询:

SELECT * FROM transaction
WHERE ((cast(date AS DATE) >= '2016-07-16' OR cast(date AS DATE) IS NULL))
       AND ((cast(date AS DATE) <= '2016-07-17' OR cast(date AS DATE) IS NULL))

请注意:静态日期是模拟开始和结束日期。和date是表列。

我知道我的代码是错误的。它仅匹配范围,而不考虑空值。另外,如果开始和结束是同一天,我将得到零结果。

你有什么想法吗?如何编辑我的代码以匹配所有提到的模式?


我有一个名为discount有两列类型TIMESTAMP named discount_start_date and discount_end_date在 MySQL 数据库中。因此,请根据表名和表中的相应列调整您的查询。

基于问题中给出的 SQL 语句的完整条件查询可以构造如下(我希望代码是不言自明的)。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Discount> criteriaQuery = criteriaBuilder.createQuery(Discount.class);
Root<Discount> root = criteriaQuery.from(entityManager.getMetamodel().entity(Discount.class));

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
java.util.Date startDate = dateFormat.parse("24-02-2016");
java.util.Date endDate = dateFormat.parse("24-03-2016");

ParameterExpression<java.util.Date> parameter = criteriaBuilder.parameter(java.util.Date.class);

Predicate startDatePredicate = criteriaBuilder.greaterThanOrEqualTo(root.get(Discount_.discountStartDate).as(java.sql.Date.class), parameter);
Predicate endDatePredicate = criteriaBuilder.lessThanOrEqualTo(root.get(Discount_.discountEndDate).as(java.sql.Date.class), parameter);

Predicate startDateOrPredicate = criteriaBuilder.or(startDatePredicate, root.get(Discount_.discountStartDate).isNull());
Predicate endDateOrPredicate = criteriaBuilder.or(endDatePredicate, root.get(Discount_.discountEndDate).isNull());

Predicate and = criteriaBuilder.and(startDateOrPredicate, endDateOrPredicate);
criteriaQuery.where(and);

List<Discount> list = entityManager.createQuery(criteriaQuery)
        .setParameter(parameter, startDate, TemporalType.DATE)
        .setParameter(parameter, endDate, TemporalType.DATE)
        .getResultList();

它会生成您感兴趣的以下 SQL 查询(如您所述,两个字段都包含在内)。

select
    discount0_.discount_id as discount1_15_,
    discount0_.discount_code as discount2_15_,
    discount0_.discount_end_date as discount3_15_,
    discount0_.discount_percent as discount4_15_,
    discount0_.discount_start_date as discount5_15_ 
from
    project.discount discount0_ 
where
    (
        cast(discount0_.discount_start_date as date)>=? 
        or discount0_.discount_start_date is null
    ) 
    and (
        cast(discount0_.discount_end_date as date)<=? 
        or discount0_.discount_end_date is null
    )

在 Hibernate 4.3.6 上进行测试,最终但平均的 ORM 框架应该生成相同的查询,无需任何修改。


在这个方法中setParameter(parameter, startDate, TemporalType.DATE),最后一个参数,即TemporalType.DATE仅当您有一列类型时才需要DATETIME or TIMESTAMP在您的数据库中,您想要比较日期而忽略此类列的时间部分。如果您的列没有像这样的时间部分,您可以简单地排除该参数DATE(MySQL)。

如有必要,您还可以使用其他日期(时间)处理 API,例如java.time or JodaTime替换Date随着SimpleDateFormat

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JPA 标准 API 进行日期比较 的相关文章

  • Pandas 按名称和最近日期合并

    我正在尝试合并名称和最接近日期的两个数据框 WRT 左侧数据框 在我的研究中我发现了一个类似的问题here https stackoverflow com questions 21201618 pandas merge match the
  • 跳过子级以获取父级 - JPA

    我面临一个问题 数据是递归获取的 我想避免孩子获取父数据 这导致了递归问题 我已经提到了下面的代码 Pojo结构 class Parent OneToMany mappedBy parent fetch FetchType LAZY pri
  • 我想最小化@Transactional 的范围吗?

    不确定 范围 在这里是否是正确的术语 我使用 Spring 进行 JPA 事务管理 下面有 Hibernate 我执行数据库事务的方法是私有的 但是由于您只能在类或类上设置 Transactional公共方法 http static spr
  • R Shiny - 如何创建根据时间单位(周、月、年)做出反应并按时间单位聚合数据的条形图

    我生成一个有关疾病的数据框 其中包含以下变量 日期 发病日期 Cases 案例数 默认情况下案例数为1 周 发病周 月份 发病月份 年份 发病年份 我的用户界面在这里 library shiny library dplyr library
  • 有没有办法使用 Hibernate/JPQL 查询 PostgreSQL hstore?

    假设我有一个如下所示的 Hibernate JPA 实体 Entity public class FooEntity Type type hstore HashMap
  • 如何在HibernateJpaAutoConfiguration中指定packagesToScan?

    我在用着HibernateJpaAutoConfiguration直接在 Spring 单元测试中 休眠时和EntityManager配置完成后 不会扫描任何实体 例外 10 29 36 377 main INFO o s b f a Au
  • 如何绘制日期和月份

    我有一张随时间变化的每日趋势图表 年份与此处无关 我只想显示日期和月份 我知道你可以显示年份和月份 但事实并非如此 我尝试创建一个名为 Day Month 的新变量 import datetime as dt df Day df date
  • 是否有充分的理由不使用 UTC 存储时间?

    我想知道是否有任何充分的理由以 UTC GMT 以外的任何时间存储时间信息 我相信这是所有软件工程的坚实规则 转换为本地时间只是出于显示目的而在 UI 层发生的转换 我还见过需要翻译才能正确实现算法的情况 用于处理午夜日期更改等 一般来说
  • 比较休眠映射的日期?

    如何使用 Hibernate 将日期从 java 对象映射到数据库 我尝试不同的方法 但我对它们不满意 为什么 让我解释一下我的问题 我有以下类 1 包括我调用的主要方法和以下映射 2 当您查看控制台输出时 您可以看到有关此方法的问题 fa
  • new Date() 和日历日期之间的区别

    在实践中 下面两个日期有什么区别 Date date new Date Date date Calendar getInstance getTime 我的理解是 new Date 是基于 UTC GMT 的日期 而日历的 getTime 基
  • Rails 3:如何获取特定时区今天的日期?

    为了获得今天的日期 我这样做 Date today gt Fri 20 May 2011 我想获取特定时区的今天日期 例如 Melbourne 我的设置中有以下设置application rb config time zone Melbou
  • 颤振文本小部件仅显示最后一个条目

    我正在尝试在 flutter 中创建日历 目前我正在实施这些活动 为了测试这一点 我创建了一个方法来检查当前日期 即创建行的时间 是否有事件 如果是这种情况 则会在表示内容的容器中打印 x 整个事情只是第一次测试 看它是否在原则上有效 当我
  • 星期几和月份的 JavaScript 全名(或如何获取每个客户端区域设置的日期名称)

    返回的字符串 new Date toString 看起来像这样 Tue Nov 22 2016 14 14 51 GMT 0800 Pacific Standard Time 是否有我们可以使用的内置方法 构造函数不会缩写星期几和 或月份
  • 字符串到 ZonedDateTime 正在更改格式

    String ip 2011 05 01T06 47 35 422 05 00 ZonedDateTime mzt ZonedDateTime parse ip toInstant atZone ZoneOffset UTC System
  • 将年月格式转换为 POSIXct [重复]

    这个问题在这里已经有答案了 我有一些年月形式的数据 我想将其格式化以用于绘图ggplot date lt c 2016 03 2016 04 2016 05 2016 06 2016 07 2016 08 2016 09 2016 10 2
  • SQLAlchemy 默认日期时间

    这是我的声明模型 import datetime from sqlalchemy import Column Integer DateTime from sqlalchemy ext declarative import declarati
  • Spring boot JPA不使用findById返回现有结果

    我使用 Oracle 数据库和一些 JPA 查询创建了一个非常小且简单的 Spring Boot 应用程序 这是不返回数据的代码片段 该数据实际上存在于数据库中 letterRecipientNonOas letterRecipientNo
  • JPA中flush的确切目的是什么

    一些令人困惑的解释 冲洗 刷新是将底层持久存储与内存中保存的持久状态同步的过程 它将更新或插入到正在运行的事务中的表中 但它可能不会提交这些更改 如果无论如何更改仅在提交后才会保留在数据库中 那么为什么要在代码中间刷新呢 运行刷新后 如果对
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht

随机推荐

  • 在单个显示器中绘制多个 jpeg 图像

    我需要在单个组合显示器 或画布 中绘制和显示多个 jpeg 图像 例如 假设我有图像 a b c d jpg 每个图像的大小不同 我想将它们绘制在 2x2 网格的一页上 能够为每个子图设置标题也很好 我一直在彻底寻找解决方案 但不知道如何去
  • C# 证书生成框架

    有谁知道可以生成公钥 私钥 X 509 证书并签署这些证书的 C 框架 BouncyCastleCrypto 虽然这个名字很疯狂 但我很确定它具有所有这些功能 几乎所有 RFC 标准均已实施 当我几年前使用它时 它的文档记录很少 但是单元测
  • ElasticSearch 映射对分组文档进行折叠/执行操作的结果

    有一个对话列表 每个对话都有一个消息列表 每条消息都有不同的字段和action场地 我们需要考虑到在对话的第一条消息中使用了动作A 在几条消息之后有使用的动作A 1过了一会儿A 1 1等等 有一个聊天机器人意图列表 对对话的消息操作进行分组
  • 从图像坐标获取对象的世界坐标

    I have been following this http docs opencv org modules calib3d doc camera calibration and 3d reconstruction html docume
  • 使用 cfchart 标签在单个饼图中显示多个查询的数据

    请考虑以下代码 现在我的代码中有以下代码 cfm页面内的 tag DataSource xx xx x xx Name of the database sgemail Name of the relevant column event vc
  • 如何通过我的 ios 应用程序的指示打开苹果地图应用程序

    我的目标是从 ios 应用程序打开带有方向的地图应用程序 我可以打开地图应用程序 但它没有显示方向 我编写的代码如下 NSString mystr NSString alloc initWithFormat http maps apple
  • 使用无图像按钮有哪些优点?

    讨论关于这个答案 https stackoverflow com questions 520640 how can i use googles new imageless button how could i reverse enginee
  • 警告变量值

    如何在警报框中显示 javascript 中变量的值 例如 我有一个变量 x 100 并且alert x 不起作用 油脂猴中使用的脚本在这里 var inputs document getElementsByTagName input va
  • PHP实现的机票预订系统

    如何防止预订系统中的座位被重复预订 我正在用 PHP 和 MYSQL 制作一个航空旅行预订系统模型作为一个项目 我有一个小问题 仅在付款后 门票和座位详细信息才会永久存储在此处 座位号在付款前分配 假设人 1 预订了飞机上的座位 x 并支付
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • Ioncube 编码的文件是否可以解码?

    我是一名 php 开发人员 我的客户计划分发一个使用 Php 开发的软件 计划使用 ioncube 或类似软件对文件进行编码 在谷歌搜索时 我发现很少有人解码这些文件 这些文件使用 ioncube 甚至其他软件进行编码 如果您询问是否可以破
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • 在哪里可以获得几乎所有英语单词的列表? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想生成一些随机文本 我尝试写一个基本的Java程序 int nowords r nextInt 2000 int i j for i 0
  • Windows 上的 Node.js 和 Express

    今晚 我决定尝试在我的 Windows 7 计算机上使用 Express 构建一个简单的 Node js 应用程序 安装过程还算顺利 但 Express 拒绝配合 以下是我已采取的步骤 使用以下位置提供的 MSI 安装 Node jshtt
  • 处理聚合的所有事件

    请参阅下面我的第一个持久订阅 namespace PersistentSubscription internal class Program private static void Main var subscription new Per
  • 使用 InlineKeyboardButton python telegram bot 发送命令

    在Python电报机器人中 是否有可能InlineKeyboardButton发送类似命令 cancel当它被按下时 例如 当用户按下取消按钮时 他们将自动发送 cancel 命令 然后由机器人处理 从这里的例子来看 https githu
  • 作为对象访问 vue-i18n 消息

    我想创建一个取决于页面的动态滑块 security signin slide1 Kitten1 slide2 Kitten2 signup slide1 Kitten1 slide2 Kitten2 slide3 Kitten3 问题是我想
  • flutter web http.get 返回“不支持的操作:Platform._version”

    我正在开发 flutter web 应用程序并尝试从互联网获取一些数据 我正在使用包 http http dart 并尝试这样做 await http get url 但我得到了这个错误 不支持的操作 Platform version da
  • Mapkit 在 IOS 13 中使用过多的 CPU

    最近 在一些用户更新到 iOS 13 x 后 我的 iOS 应用程序开始频繁崩溃 在 iOS 12 x 中没有出现该问题 我正在使用 Mapkit 渲染一些 MKPolygons 和 MKPolylines MKPolylines 被删除并
  • 使用 JPA 标准 API 进行日期比较

    我有一个包含两个日期的范围日期选择器 start and end 其中两者都可以为空 我想过滤一张表 其中实体具有确切的一个日期 date 所以 这里有一些例子 我愿意匹配 想象要匹配的日期是当前日期 17 07 2016 空 17 07