我的第一个问题,我们开始吧。所以,我必须找到一种方法来按枚举字段对结果进行排序。我有枚举:
@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() 方法不起作用,我知道为什么,但是有没有办法根据文档状态的俄语描述对结果进行排序?任何回应将不胜感激。
找到这种解决方案,如果有人遇到过这种情况。 在不带参数的实体类中使用@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;
}
}
就是这样。