Criteria API order by enum property

问题描述 投票:0回答:1

我的第一个问题,我们开始吧。所以,我必须找到一种方法来按枚举字段对结果进行排序。我有枚举:

@Getter
public enum DocState {
    CREATED("создан"),
    SIGNED("подписан"),
    PARTSIGNED("частично подписан"),
    CHECKERROR("не прошел проверку"),
    DELETED("удален");

    private String description;

    DocState(String description) {
        this.description = description;
    }
}

和文档标准存储库:

@Component
public class CriteriaDocumentRepository {

    private final EntityManager entityManager;
    private final CriteriaBuilder criteriaBuilder;

    public CriteriaDocumentRepository(EntityManager entityManager) {
        this.entityManager = entityManager;
        this.criteriaBuilder = entityManager.getCriteriaBuilder();
    }

    public Page<Document> getDocuments(DocPageRequest pageRequest) {
        var query = criteriaBuilder.createQuery(Document.class);
        var root = query.from(Document.class);

        setOrder(pageRequest, query, root);

        var typerQuery = entityManager.createQuery(query);
        typerQuery.setFirstResult(pageRequest.getPage() * pageRequest.getSize());
        typerQuery.setMaxResults(pageRequest.getSize());

        var pageable = getPageable(pageRequest);

        var docCount = getDocCount();

        return new PageImpl<>(typerQuery.getResultList(), pageable, docCount);
    }

    private Long getDocCount() {
        var query = criteriaBuilder.createQuery(Long.class);
        var root = query.from(Document.class);
        query.select(criteriaBuilder.count(root));
        return entityManager.createQuery(query).getSingleResult();
    }

    private Pageable getPageable(DocPageRequest pageRequest) {
        var sort = Sort.by(pageRequest.getSort(), "description");
        return PageRequest.of(pageRequest.getPage(), pageRequest.getSize(), sort);
    }

    private void setOrder(DocPageRequest pageRequest, CriteriaQuery<Document> query, Root<Document> root) {
        if (pageRequest.getSort().isAscending()) {
            query.orderBy(criteriaBuilder.asc(root.get("state").get("description")));
        }
        if (pageRequest.getSort().isDescending()) {
            query.orderBy(criteriaBuilder.desc(root.get("state").get("description")));
        }
    }
}

当然 setOrder() 方法不起作用,我知道为什么,但是有没有办法根据文档状态的俄语描述对结果进行排序?任何回应将不胜感激。

criteria hibernate-criteria criteria-api
1个回答
0
投票

找到这种解决方案,如果有人遇到过这种情况。 在不带参数的实体类中使用@Enumerated 注释(它会将枚举存储为数据库中的序数)。

@Column(name = "state")
@Enumerated
private DocState state;

在 enam 类中,按照您想要的顺序排列常量(在我的例子中,是描述的字母顺序)。

@Getter
public enum DocState {
    CHECKERROR("не прошел проверку"),
    SIGNED("подписан"),
    CREATED("создан"),
    DELETED("удален"),
    PARTSIGNED("частично подписан");

    private String description;

    DocState(String description) {
        this.description = description;
    }
}

就是这样。

© www.soinside.com 2019 - 2024. All rights reserved.