【问题标题】:Hibernate Joda DateTime SortingHibernate Joda DateTime 排序
【发布时间】:2013-01-11 13:04:00
【问题描述】:

我正在使用 Joda DateTime 和休眠 4 的 UserType 库

我有一个具有以下字段的 JPA 实体

@Columns(columns = { @Column(name = "lastUsedDateTimeStamp"), @Column(name = "lastUsedDateTimeStamp_TMZ") })
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTimeAsString")
private DateTime lastUsedDateTimeStamp;

我正在使用普通的 Spring Data JPA 存储库,如下所示:

return repository.findAll(new PageRequest(0, 5, new Sort(Sort.Direction.DESC, "lastUsedDateTimeStamp"))).getContent();

但是,当我查看 hibernate 在日志中抛出的 sql 时,它的结尾如下:

order by
        entity.lastUsedDateTimeStamp,
        entity.lastUsedDateTimeStamp_TMZ asc limit ?

这意味着排序未按预期对 lastUsedDateTimeStamp 列进行,因为“asc”关键字位于 lastUsedDateTimeStamp_TMZ 而不是 lastUsedDateTimeStamp 之后。

有谁知道我可以如何修复它,以便查询在正确的字段上指定“asc”?

【问题讨论】:

    标签: hibernate jodatime spring-data-jpa


    【解决方案1】:

    自己解决了这个问题, 必须编写我自己的自定义 PersistentDateTimeAsString 和 AbstractMultiColumnDateTime 类来反转 2 个字段的默认顺序。

    时区现在在顺序中排在第一位,然后是日期时间。 所以现在的sql看起来是这样的:

    order by
            entity.lastUsedDateTimeStamp_TMZ,
            entity.lastUsedDateTimeStamp asc limit ?
    

    【讨论】:

    • 您是否可以将自定义类添加到此答案中?
    • 但这不能正常工作,不是吗?我想,解决这个问题的唯一跨平台方法是创建一个时间戳字段。在 Postgres 中可以创建一个函数,并按其结果排序。
    • 很抱歉,我们甚至不再使用此解决方案。我们已经迁移到 Java 8 Time api,它不需要这个 hack。我现在会向其他任何人提出同样的建议
    猜你喜欢
    • 2014-05-12
    • 2015-02-03
    • 2011-09-11
    • 2017-04-03
    • 2015-01-11
    • 2011-01-12
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多