我正在使用这种方法:
List<Client>findTop10ByGenderOrderBySurvey_Results_ScoreDesc(char gender);
逻辑是:
我有一个客户模型,参考调查模型的OneToMany,调查模型有一个OneToOne的参考,结果模型有得分字段。 因此,一个客户可以进行许多调查,每个调查都有一个分数。
我想按顺序订购客户,按降序排列,然后获得评分最高的前10名男性客户。
我正在使用的方法会按性别过滤,并返回10个客户端。 但它不止一次地返回同一个客户端,因为它有几个调查。而不是以有序的方式。
我做错了什么以及如何解决这个问题?
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "client_id")
private Long id;
@Column(name = "gender")
private char gender;
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Survey> survey= new ArrayList<Survey>();
}
public class Survey{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "SURVEY_ID")
private Long Id;
@ManyToOne
@JsonBackReference
@JoinColumn(name = "client_id")
public Client client;
@OneToOne(cascade=CascadeType.ALL)
@JsonManagedReference
@JoinColumn(name = "surveyresult_id")
private Results surveyResults;
}
public class Results {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "SURVEYRESULT_ID")
private Long Id;
private Double score;
}
答案 0 :(得分:0)
要过滤掉重复的结果,请使用distinct
关键字:
List<Client> findDistinctTop10ByGenderOrderBySurvey_Results_ScoreDesc(char gender);
OrderBy
语法不正确。要按多个属性排序,只需将它们添加为:
List<Client> findDistinctTop10ByGenderOrderBySurveyDescResultsDescScoreDesc(char gender);
注意:当方法名称变得很长时,表明查询可能过于复杂而无法成为派生查询。然后,建议使用@Query
和更短的更高级别的方法名称来描述查询。