【问题标题】:JPA: How do I sort by field customising order when using findAll with specificationJPA:使用带有规范的findAll时如何按字段自定义顺序排序
【发布时间】:2021-12-18 14:45:28
【问题描述】:

我正在使用带有 Java 8 的 Spring Tool Suite 4 (4.12.0.RELEASE),并且我有以下代码可以从过滤、分页和排序的表中获取结果:

// Define pageable
    Sort sort = JpaSort.unsafe(Sort.Direction.ASC, Arrays.asList("FIELD(Status, '0','6','1','3','7')"));
    Pageable pageRequest = PageRequest.of(searchCriteria.getPageNo(), searchCriteria.getPageSize(), sort);
    
    // Initialise specification
    Specification<BestPracticeAdminList> spec = Specification.where(null);

    // If search criteria contains searchText field, add it to the specification
    if(searchCriteria.getSearchText() != null)
        spec = spec.and(BestPracticeAdminListFilter.titleLike(searchCriteria.getSearchText()));
    
    // If search criteria contains filters field, inspect filters field
    if(searchCriteria.getFilters() != null) {
        
        // If search criteria contains subjectID field, add it to the specification
        if(searchCriteria.getFilters().getSubjectID() != null)
            spec = spec.and(BestPracticeAdminListFilter.hasAlternativeSubjectID(searchCriteria.getFilters().getSubjectID()));
        
        // If search criteria contains categoryID field, add it to the specification
        if(searchCriteria.getFilters().getCategoryID() != null)
            spec = spec.and(BestPracticeAdminListFilter.hasAlternativeSubjectCategoryID(searchCriteria.getFilters().getCategoryID()));
        
        // If search criteria contains status field, add it to the specification
        if(searchCriteria.getFilters().getStatus() != null)
            spec = spec.and(BestPracticeAdminListFilter.hasStatus(searchCriteria.getFilters().getStatus()));
        
    }
    
    // Get results
    Page<BestPracticeAdminList> pagedResults = bestPracticeAdminListRepository.findAll(spec, pageRequest);

问题是添加自定义排序。我需要按状态字段进行排序,它是一个枚举器,但是按照特定的顺序,而不是枚举器的写入顺序。

在使用 @Query 和 nativeQuery=true 的存储库上使用本机查询时,自定义排序在不同的情况下工作,但在这种情况下,当我想使用带有过滤规范的 findAll 方法时。

这是实体类:

@Entity
@Table
public class BestPracticeAdminList implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "BestPracticeAdminListID")
private int bestPracticeAdminListID;

@Column(name = "Title")
private String title;

@Column(name = "BestPracticeID")
private int bestPracticeID;

@Column(name = "AlternativeSubjectID")
private int alternativeSubjectID;

@Column(name = "AlternativeSubjectCategoryID")
private int alternativeSubjectCategoryID;

@Column(name = "Status")
@Enumerated(EnumType.ORDINAL)
private LookupReportingProvisionWorkflowStatus status;

@Column(name = "IsPreviousVersionPublished")
private Boolean isPreviousVersionPublished; 

public BestPracticeAdminList() {
}

目前,我得到的例外是:

 org.springframework.data.mapping.PropertyReferenceException: No property fIELD(Status, '0','6','1','3','7') found for type BestPracticeAdminList!

我该如何解决这个问题?谢谢

【问题讨论】:

    标签: java sorting jpa


    【解决方案1】:

    由于 Spring 抱怨您没有排序字段,您可以通过在 @Formula 中的 @Formula 中使用 FIELD 函数创建它来解决此问题

    @Formula("FIELD(Status, '0','6','1','3','7')")
    private String sortingStatus;
    

    并使用它进行排序

    Sort sort = JpaSort.unsafe(Sort.Direction.ASC, Arrays.asList("sortingStatus"));
    

    【讨论】:

    • 成功了!!谢谢:)
    猜你喜欢
    • 2021-07-02
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2012-11-02
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多