【问题标题】:Sorted map of Java primitives using JPA2 and Hibernate?使用 JPA2 和 Hibernate 的 Java 原语的排序映射?
【发布时间】:2011-07-29 19:22:39
【问题描述】:

我使用 Hibernate 3.6 和 JPA2 作为 Play Framework 1.2 的一部分。我有一个实体类,它需要一个 Double-to-Double 映射,按键排序。到目前为止,这是我所得到的:

@Entity
public class MyEntity extends Model
{
    @ElementCollection
    @MapKeyColumn(name="keycolumn")
    @OrderBy("keycolumn")
    public Map<Double, Double> myMap;   
}

我使用 YAML 将一组测试数据加载到我的数据库中,故意不按顺序进行,以便我可以验证排序是否正常:

myMap: {100.0: -10.0, 200.0: -5.0, 125.0: -8.0, 300.0: -2.0, 50.0: -12.0}

不幸的是,到目前为止还不是:

Key: 100.000000, value: -10.000000
Key: 200.000000, value: -5.000000
Key: 125.000000, value: -8.000000
Key: 300.000000, value: -2.000000
Key: 50.000000, value: -12.000000

如果排序正常,我希望看到:

Key: 50.000000, value: -12.000000
Key: 100.000000, value: -10.000000
Key: 125.000000, value: -8.000000
Key: 200.000000, value: -5.000000    
Key: 300.000000, value: -2.000000

数据库不是我的强项,而且我对 JPA 也很陌生。一直在挖掘 Hibernate 文档和各种论坛,但没有真正的运气。非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    最快的方法是把它变成一个SortedMap并使用@Sort:

    @Sort(type = SortType.COMPARATOR, comparator = WhateverComparator.class)
    

    根据annotations reference

    【讨论】:

    • 尝试使用 Double.compare() 创建一个实现 compareTo() 的 DoubleComparator 类,但没有成功。最终决定只使用 Hibernate 给我的地图,并将所有值推入 TreeMap 给我一个排序的地图。不过,谢谢。
    • 哦,我的错。对于双打,您可以只使用 SortType.NATURAL。无需编写比较器。然后 Hibernate 基本上会手动完成您正在做的事情。
    • 在我的情况下无法正常工作。我使用 Hibernate 作为 Play Framework 的一部分,并从 YML 文件加载示例数据。 Play 的 YML 加载代码似乎想将我的数据加载为 LinkedHashMap,当 Hibernate 尝试将其视为 SortedMap 时,这会导致 ClassCastException。哦,好吧 - 现在只要能够在运行时对其进行排序就足够了。无论如何,谢谢。
    【解决方案2】:

    以下将适用于 key 是原始包装器或您的自定义对象实现可比较的任何情况。 我会避免比较器并让 Object 实现 Comparable,这样我就可以简单地使用

    @Sort(type = SortType.NATURAL)

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      相关资源
      最近更新 更多