【发布时间】:2020-12-07 04:44:40
【问题描述】:
冬眠者们好! 我有一个关于 DistinctBy 子句如何与 Spring Data's projection
结合使用的问题假设我有 3 个班级:
public class Task {
Long id;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "project_id")
private Project project;
@OneToOne
@JoinColumn(name = "contact_id")
private Contact assigned;
Boolean deleted;
// ...
}
public class Contact {
Long id;
// ...
}
public class Project {
Long id;
@OneToMany(fetch = LAZY, mappedBy = "project")
private Set<Task> tasks;
// ...
}
这些将是我的域类。请注意,Project 确实对 Tasks 有“One2Many”,而 Contact 没有。现在,我有 2 个用于我的预测的接口和带有 2 种方法的基本 TaskRepo:
public interface JustProject {
Project getProject();
}
public interface JustAssignee {
Contact getContact();
}
public class TaskRepo extends CrudRepository<Task, Long>, JpaSpecificationExecutor<Task> {
List<JustAssignee> findDistinctByDeletedFalse();
List<JustProject> findDistinctByDeletedFalseAndDeletedFalse();
}
它现在对我有用的方式是,findDistinctByDeletedFalse 返回与任务的不同联系人一样多的实例(例如,如果有 10 个任务但只有 3 个联系人,则该方法将仅返回 3 个包含所有3 个不同的联系人)。 findDistinctByDeletedFalseAndDeletedFalse 相同,但在项目级别。
现在我在这里有几个问题,希望能得到一些帮助,以了解它是如何工作的。
-
distinct 子句是否在搜索完成后应用?
- 我最初的假设是这种行为不会像现在这样起作用。我假设在获取结果之前应用了 distinct 子句,这意味着它将是基于底层任务模型的 DISTINCT,而不是返回的
JustContact或JustProject模型。
- 我最初的假设是这种行为不会像现在这样起作用。我假设在获取结果之前应用了 distinct 子句,这意味着它将是基于底层任务模型的 DISTINCT,而不是返回的
-
有什么办法可以不滥用
...AndDeletedFalse冗余附录?我需要 repo 中的两种方法,但我觉得我必须作弊才能获得结果...... -
...我做错了吗?我想尽可能优雅地获得“分配给所有任务的所有不同联系人/项目”。我最终想到了这个 distinctby 正是因为我不确定它是如何工作的,并且想试试运气。我真的不认为它会以这种方式工作,但现在我真的很想了解它为什么会这样!
非常感谢
【问题讨论】:
标签: spring-boot hibernate spring-data-jpa spring-data spring-projections