我正在使用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);
}
现在您已经看到了代码,让我清楚地解释行为。
首先,我运行gradle clean
,然后运行gradle build
,然后运行该应用程序。之后,我发出一个请求(无论是从应用程序发出还是直接在浏览器或Postman等中发出请求,结果都是一样的)advancedSearch?page=0&size=10&sort=employee,asc&sort=active,asc&month=1&year=2020
。一切都很好,结果首先按employee
排序,然后按active
排序。
现在我停止应用程序,gradle build
,运行该应用程序。再次执行请求,排序中将忽略employee
,结果仅通过active
标志进行排序。
现在,再次,我停止应用程序,gradle build
,运行该应用程序。再次执行请求,一切正常。我没有跑clean
!而且我没有更改源代码中的任何内容。
现在,再次第四次,我停止应用程序,gradle build
,运行该应用程序。再次执行请求,排序中将忽略employee
,结果仅通过active
标志进行排序。在第四次构建后,直到运行clean
命令,我才能继续工作。
为了使其变得比现在更复杂,某些实体属性的行为类似。我组合排序参数还是只使用一个都没关系。
employee
:有时工作projectNumber
:有时工作initialMailSent
,lastReminderSent
,active
:始终工作(彼此结合)][当员工不是working
时,projectNumber
也不在工作,另一方面,如果一个人在工作,则另一人也在工作。
过滤器(month
,year
)始终相同,并且不会对行为产生影响。
Querdsl正在生成一些类,因此我认为这些类可能会引起问题。但这并没有接缝,因为我在持续集成链中存在几乎相同的问题,因此在第一次构建,第二次不使用和第三次构建之间进行切换。因此,仅执行步骤2和3。在链中,构建始终以干净的代码开始(没有生成的类,它们是在生成期间生成的。)
有人有同样的问题,并且有更好的解释和解决方案吗?
我正在使用Spring Boot和Angular建立数据仓库。对于某些表,我需要搜索,过滤,(多)排序和分页的组合。因此,我使用Querydsl,它非常适合我的...
经过几个小时的搜索,我终于找到了问题。