【问题标题】:JPA: Comparing (>=) ordinal enum in queryJPA:比较(> =)查询中的序数枚举
【发布时间】:2013-03-04 09:50:20
【问题描述】:

我有一个枚举,每个项目都分配了 int 值。

    public enum RankEnum {
            NO_RANK(0),
            FIRST_RANK(1),
            ...,
            LAST_RANK(7);

            private int rank;

            RankEnum(int rank) { this.rank = rank; }

            public int getRank() { return this.rank; }
    }

整数值的使用是为了更容易地比较不同的元素,关于它们的等级(例如 e1.rank

    @Column(...)
    @Enumerated(EnumType.ORDINAL)
    private RankEnum rank;

不幸的是,当我尝试创建查询以查找例如所有排名高于另一个实体 x 的实体时,结果不正确。

    Select entity FROM Entity entity WHERE entity.rank > :rank

:rank 绑定到 x.getRank();

所以问题是:在这种情况下,jpa 实际比较的是什么?由于映射是有序的,我认为这应该可以工作,因为值存储为整数。

提前致谢。

【问题讨论】:

  • 你看过生成的 SQL 了吗?
  • ...在哪里 entity0_.RANK > ?
  • 好的,RANK 在数据库中是什么样子的?您说结果“不正确” - 与您的预期相比会发生什么?
  • 在数据库中排名是一个 NUMBER(2,0) 并且似乎被正确存储。在我的测试中,我有 entity1.rank = NO_RANK(存储为 0)和 entity2.rank = SECOND_RANK(存储为 2)。当我对 entity1 执行上述查询时,我得到一个空列表,但我希望 entity2 作为结果。

标签: java hibernate jpa-2.0


【解决方案1】:

枚举的序号与分配给每个枚举实例的排名无关。每个枚举都有一个序数。第一个声明的序号从 0 开始,然后是 1,然后是 2,依此类推:

public enum Season {
    WINTER, // ordinal = 0
    SPRING, // ordinal = 1
    SUMMER, // ordinal = 2
    AUTUMN; // ordinal = 3
}

枚举可以通过它们的序数自动进行比较。所以Season.WINTER.compareTo(Season.SPRING) < 0

【讨论】:

  • 好的,所以忘记我分配的整数......但我在我的问题中发布的查询仍然不起作用。因此,根据序数值比较枚举似乎不适用于 JPA。
  • 开启 SQL 日志,查看生成了哪些 SQL 查询,以及使用了哪些参数。告诉我们数据库包含的内容、测试的内容、您期望的结果以及您得到的结果。检查你的测试:你的问题标题是>=,但查询是>
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多