首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按Enum分类的JPQL订单

按Enum分类的JPQL订单
EN

Stack Overflow用户
提问于 2012-02-09 17:06:35
回答 2查看 3.1K关注 0票数 0

我想从按优先级列排序的表中获取数据。我们使用javaee 6,GF 3.1。

我们的实体看起来像这样

代码语言:javascript
运行
复制
@Entity
@Table(name="ITEMS")
@NamedQueries({
    @NamedQuery(
        name = "Item.findbyPriority",
        query = "select i from Item i where ORDER BY i.priority DESC" )
})
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Integer id;



    String data inputFile;


    @Enumerated(EnumType.ORDINAL)
    Priority priority;


...
}

优先级被定义

代码语言:javascript
运行
复制
public enum Priority {

    HIGH,
    NORMAL;
}

然而,Item.findbyPriority查询按序号排序,并返回错误的顺序。如果我将优先级类更改为

代码语言:javascript
运行
复制
public enum Priority {

        NORMAL,
        HIGH;
    }

它可以正常工作。但这并不是真正有力的措施。如果我添加新的优先级使用或重新排序它呢?

我试图重写compareTo方法,但它在Enum类中是最终的。

在这种情况下我能做什么?怎么才能做得好呢?

我知道我可以将优先级存储为number等,但我不得不手动将实体同步到Enum,这并不是非常好。也许“PrePersist”、“PreUpldate”和“PostLoad方法”是要走的路?那么jpql查询会是什么样的呢?

谢谢,

米兰

EN

Stack Overflow用户

发布于 2021-07-13 17:27:24

JPA 2.1之后,您可以使用@Convert注释。这允许在保存数据库之前将枚举的对象转换为舒适的排序视图。

代码语言:javascript
运行
复制
public enum Priority {
    NORMAL(100),
    HIGH(200);

    private final int sortNum;

    Priority(int sortNum) {
        this.sortNum = sortNum;
    }

    public int getSortNum() {
        return this.sortNum;
    }
}
代码语言:javascript
运行
复制
@Converter(autoApply = true)
public class PriorityConverter implements AttributeConverter<Priority, Integer> {

    @Override
    public Integer convertToDatabaseColumn(Priority attribute) {
        return attribute == null ? null : attribute.getSortNum();
    }

    @Override
    public Priority convertToEntityAttribute(Integer dbData) {
        return dbData == null
                ? null
                : Stream.of(Priority.values())
                .filter(t -> t.getSortNum() == dbData)
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException(
                        String.format("Priority with sortNum %s is not exist", dbData)));
    }
}

您的枚举对象将以100200的形式保存在数据库中。将来您可以轻松地添加新的优先级对象。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9215369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档