Spring Boot Querydsl:排序-有时不适用于特定的实体属性

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

我正在使用Spring Boot和Angular建立数据仓库。对于某些表,我需要搜索,过滤,(多)排序和分页的组合。因此,我使用Querydsl,它完全符合我的需求。但是我有一些问题。构建Java应用程序后,有时无法对实体的某些属性进行排序。调试显示,对于这些指定属性,sorting中的pageable参数为UNSORTED

为了更清楚一点,我将显示一些代码。实体:

Entity
@Table(name = "ExternalEffortLinkManagement", schema = "dbo")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "externalEffortLinkManagementId")
public class ExternalEffortLinkManagement {

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "ExternalEffortLinkManagement_ID")
    private long externalEffortLinkManagementId;

    @Column(name = "Mitarbeiter")
    private String employee;

    @Column(name = "Jahr")
    private int year;

    @Column(name = "Monat")
    private int month;

    @Column(name = "Projektnummer")
    private String projectNumber;

    @Column(name = "InitialMailSent")
    private Timestamp initialMailSent;

    @Column(name = "LastReminderSent")
    private Timestamp lastReminderSent;

    @Column(name = "Active")
    private boolean active;

控制器中的方法:

    @RequestMapping(value = EXTERNAL_EFFORT_LINK_MANAGEMENT_URL + "/advancedSearch", method = RequestMethod.GET)
    @ResponseBody
    public PagedResources<ExternalEffortLinkManagement> advancedSearch(
            @RequestParam(value = "search", required = false) String search,
            Pageable pageable, @RequestParam MultiValueMap<String, String> parameters,
            PersistentEntityResourceAssembler persistentEntityResourceAssembler
    ) {
        SimpleGrantedAuthority[] allowedRoles = {SYSADMIN, SUBCONTRACTOR_MANAGEMENT}; // <-- Debug point was here

        GeneralPredicateBuilder<ExternalEffortLinkManagement> builder = new GeneralPredicateBuilder<ExternalEffortLinkManagement>(ExternalEffortLinkManagement.class);
        Predicate predicate = predicateService.getPredicateFromParameters(parameters, ExternalEffortLinkManagement.class);
        Page<ExternalEffortLinkManagement> results = service.advancedSearch(
                this.buildAdvancedSearch(search, predicate, builder), pageable, allowedRoles);
        return super.toPagedResource(results, persistentEntityResourceAssembler);
    }

存储库:

@CrossOrigin(exposedHeaders="Access-Control-Allow-Origin")
@RepositoryRestResource(collectionResourceRel = EXTERNAL_EFFORT_LINK_MANAGEMENT_URL, path = EXTERNAL_EFFORT_LINK_MANAGEMENT_URL)
public interface ExternalEffortLinkManagementRepositoryExtEff extends PagingAndSortingRepository<ExternalEffortLinkManagement, Long>, JpaSpecificationExecutor<ExternalEffortLinkManagement>, QuerydslPredicateExecutor<ExternalEffortLinkManagement> {

};

服务方法:

    public Page<ExternalEffortLinkManagement> advancedSearch(Predicate predicate, Pageable pageable, SimpleGrantedAuthority[] roles){
        if (SecurityUtils.userHasAnyRole(roles)) {
            return this.calcSumHours(this.repository.findAll(predicate, pageable));
        } else throw new ForbiddenException(FORBIDDEN);
    }

现在您已经看到了代码,让我清楚地解释行为。

  1. 首先,我运行gradle clean,然后运行gradle build,然后运行该应用程序。之后,我发出一个请求(无论是从应用程序发出还是直接在浏览器或Postman等中发出请求,结果都是一样的)advancedSearch?page=0&size=10&sort=employee,asc&sort=active,asc&month=1&year=2020。一切都很好,结果首先按employee排序,然后按active排序。

  2. 现在我停止应用程序,gradle build,运行该应用程序。再次执行请求,排序中将忽略employee,结果仅通过active标志进行排序。

  3. 现在,再次,我停止应用程序,gradle build,运行该应用程序。再次执行请求,一切正常。我没有跑clean!而且我没有更改源代码中的任何内容。

  4. 现在,再次第四次,我停止应用程序,gradle build,运行该应用程序。再次执行请求,排序中将忽略employee,结果仅通过active标志进行排序。在第四次构建后,直到运行clean命令,我才能继续工作。

为了使其变得比现在更复杂,某些实体属性的行为类似。我组合排序参数还是只使用一个都没关系。

  • [employee:有时工作
  • [projectNumber:有时工作
  • [initialMailSentlastReminderSentactive:始终工作(彼此结合)]

[当员工不是working时,projectNumber也不在工作,另一方面,如果一个人在工作,则另一人也在工作。

过滤器(monthyear)始终相同,并且不会对行为产生影响。

Querdsl正在生成一些类,因此我认为这些类可能会引起问题。但这并没有接缝,因为我在持续集成链中存在几乎相同的问题,因此在第一次构建,第二次不使用和第三次构建之间进行切换。因此,仅执行步骤2和3。在链中,构建始终以干净的代码开始(没有生成的类,它们是在生成期间生成的。)

有人有同样的问题,并且有更好的解释和解决方案吗?

我正在使用Spring Boot和Angular建立数据仓库。对于某些表,我需要搜索,过滤,(多)排序和分页的组合。因此,我使用Querydsl,它非常适合我的...

java spring-boot querydsl
1个回答
0
投票

经过几个小时的搜索,我终于找到了问题。

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