gpt4 book ai didi

java - Spring Boot Querydsl : Sorting - sometimes not working for specifc enitity attribute

转载 作者:行者123 更新时间:2023-12-01 18:39:40 27 4
gpt4 key购买 nike

我正在使用 Spring Boot 和 Angular 构建数据仓库。对于某些表,我需要搜索、过滤、(多)排序和分页的组合。因此我使用 Querydsl,它完全符合我的需求。但我有一些问题。构建 Java 应用程序后,排序有时不适用于我的实体的某些属性。调试显示,对于这些指定属性,pageable 中的sorting 参数是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;

Controller 中的方法:

    @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 cleangradle build 和应用程序。之后,我发出一个请求(无论我是从应用程序还是直接在浏览器或 postman 等中执行,结果都是相同的) advancedSearch?page=0&size=10&sort=employee,asc&sort=active ,asc&月份=1&年=2020。一切都很好,结果首先按员工排序,然后按活跃排序。

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

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

  4. 现在,我又第四次停止应用程序,gradle build,运行应用程序。再次执行请求,排序时会忽略 employee,结果仅按 active 标志排序。第四次构建后,我不再工作,直到运行 clean 命令。

为了使其比现在更加复杂,某些实体属性的行为是相似的。组合排序参数或仅使用一个排序参数并不重要。

  • 员工:有时工作
  • projectNumber:有时工作
  • initialMailSentlastReminderSentactive:始终工作(也可以相互组合)

当员工不工作时,projectNumber也不工作,另一边如果一个在工作,另一个也在工作。

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

Querdsl 正在生成一些类,所以我认为这些类可能会导致问题。但事实并非如此,因为我在持续集成链中遇到了几乎相同的问题,它在第一个构建中工作、在第二个构建中不工作、在第三个构建中工作等等之间切换。因此只需执行步骤 2 和 3。在链中,构建始终以干净的代码开始(没有生成的类,它们是在构建期间生成的)。

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

最佳答案

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

我们有一些“旧”实体类 ExternalEffortLinkManagement ,其属性几乎相同,但缺少 employeeprojectNumber 。这个类被放置在另一个包中。这解释了为什么所有其他属性始终被接受为有效的排序参数,但员工和项目编号却不然。

看起来 java build 正在混合这两个类(旧的和新的)。我目前不明白为什么构建有时使用新类有时使用旧类。

但是删除旧的类解决了问题。我仍然认为构建之间的不一致一定是编译器中的错误或类似的东西,因为对我来说这没有意义,有时使用包 a 中的类 a,有时使用包 b 中的类 a。

关于java - Spring Boot Querydsl : Sorting - sometimes not working for specifc enitity attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59963388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com