【问题标题】:JPA Criteria API: how to retrieve date in "mm/dd/yyyy" formatJPA Criteria API:如何以“mm/dd/yyyy”格式检索日期
【发布时间】:2017-02-21 18:31:53
【问题描述】:

我想以“mm/dd/yyyy”格式检索我的列日期之一。此列当前同时返回日期和时间,但我只想要“mm/dd/yyy”格式的日期。

下面是我想要转换为标准 api 的 postgresql 查询

select    DISTINCT c.name as Facility,
          to_char(begin_exam,'mm/dd/yyyy') as begin_exam
from  a inner join  b on a.rad_exam_id = b.id 
                      inner join  c on c.id = b.site_id
group by c.name,to_char(begin_exam,'mm/dd/yyyy')
order by c.name,to_char(begin_exam,'mm/dd/yyyy')

我在互联网上搜索了很多,但没有找到任何对我有帮助的解决方案。请帮助我为此编写标准 api 查询。

【问题讨论】:

  • 您可以将其提取为普通的java.util.Date,然后将其格式化为您的 HTML/XML/JSON 输出或您正在使用的任何内容。
  • 我想在 group by 子句中使用 mm/dd/yyyy 格式。

标签: java postgresql jpa criteria-api


【解决方案1】:

如果您想以“mm/dd/yyyy”格式显示列日期以便在前端显示。以下可能适用于这种情况。

public class SomeDTO {

@JsonFormat(pattern="mm/dd/yyyy")
private Date someDate;

}

【讨论】:

    【解决方案2】:

    Criteria API 定义function expressionCriteriaBuilder 接口中执行原生SQL函数如下:

    <T> Expression<T> function(String name, Class<T> type, Expression<?>... args);
    

    其中name 是 SQL 函数的名称,type 是预期的返回类型,args 是参数的变量列表(如果有)。

    这是一个如何在条件查询中使用它的示例:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery(String.class);
    Root<RadExamTimes> root = cq.from(RadExamTimes.class);
    cq.select( cb.function("to_char", String.class, root.get("begin_exam"), cb.literal("MM/DD/YYYY")));
    
    TypedQuery<String> query = entityManager.createQuery(cq);
    List<String> result = query.getResultList();
    

    在哪里

    • RadExamTimes:假设的根实体
    • MM/DD/YYYY:特定于数据库的格式(在本例中 Postgresql 日期格式;对于 Oracle 使用 Ora 格式等)
    • to_char: Postgresql 函数将日期值转换为字符串
    • begin_exam:要格式化的日期字段

    格式字符串不能按原样传递,所以使用literal()方法来包装它。

    注意:上面的例子是在 MySQL 数据库上测试的,带有 MySQL 函数和对应的日期格式;但示例更改为匹配 Postgresql 语法。

    【讨论】:

    • 感谢您的回答。但我在 jruby (java + ruby​​) 技术中。它给了我错误 NameError: no method 'function' for arguments (org.jruby.RubyString,org.jruby.Ru byClass,org.hibernate.ejb.criteria.expression.LiteralExpression) on Java::OrgHib ernateEjbCriteria::CriteriaBuilderImpl
    • 感谢您的反馈。你不应该相应地标记你的问题吗?没有提到 JRuby。
    • 我刚刚在我的系统上进行了测试以验证它是否确实有效并修改了答案,因为它可能会帮助其他有类似问题的用户。
    【解决方案3】:
    SELECT '2001-02-16 20:38:40'::date;
    
    date
    ----------------
    2001-02-16
    (1 row)
    

    或者您可以在 JPA 实体字段上使用 @TemporalType

    【讨论】:

    • 我想要 mm/dd/yyyy 格式的日期以及将 @temporatType 关键字放在标准 api 查询中的位置
    猜你喜欢
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多