В моем проекте MySql я получил эту конкретную модель с 3 объектами: Prodotto с несколькими дочерними объектами QuotaIngrediente, который, в свою очередь, также является многодетным дочерним компонентом Ingrediente. Все мои отношения двунаправлены. Все они получили автоматически сгенерированный целочисленный идентификатор и другие поля, удаленные, чтобы сосредоточиться на интересных.
@Entity
public class Prodotto {
private List<QuotaIngrediente> listaQuoteIng = new ArrayList<QuotaIngrediente>();
@OneToMany(mappedBy = "prodotto", cascade = CascadeType.ALL, orphanRemoval = true)
public List<QuotaIngrediente> getListaQuoteIng() {
return listaQuoteIng;
}
@Entity
public class QuotaIngrediente{
private Prodotto prodotto;
private Ingrediente ing;
private Double perc_ing;
@ManyToOne
@JoinColumn(name = "prodotto")
public Prodotto getProdotto() {
return prodotto;
}
@ManyToOne
@JoinColumn(name = "ing")
public Ingrediente getIng() {
return ing;
}
@Entity
public class Ingrediente {
private Set<QuotaIngrediente> quoteIng = new HashSet<QuotaIngrediente>();
@OneToMany(mappedBy = "ing", cascade = CascadeType.ALL, orphanRemoval = true)
public Set<QuotaIngrediente> getQuoteIng() {
return quoteIng;
}
Я использую спецификацию SpringData и могу создать запрос для получения Prodotto на основе по критериям Ingrediente, таким образом:
public static Specification<Prodotto> getProdottoByIngSpec (String ing) {
if (ing != null) {
return (root, query, criteriaBuilder) -> {
query.groupBy(root.get(Prodotto_.id));
return criteriaBuilder.like(((root.join(Prodotto_.listaQuoteIng))
.join(QuotaIngrediente_.ing))
.get(Ingrediente_.nome), "%"+ing+"%");
};
Работает как положено, но теперь я хочу отсортировать его по полю QuotaIngrediente perc_ing ЭТОГО СПЕЦИФИКА C INGREDIENTE. Очевидно, я спрашиваю, как это сделать на БД, а не в бизнес логи c.