Spring Data Specification orderBy подзапрос - PullRequest
0 голосов
/ 03 марта 2020

В моем проекте 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.

1 Ответ

0 голосов
/ 07 марта 2020

Я боролся с ложной проблемой из-за моего неверного предположения. Решение было самым простым. Просто отсортируйте по порядку методом CriteriaQuery. Запрос, который я использовал для поиска, уже отфильтровал QuotaIngrediente, возвращая только те строки, которые соответствуют моим критериям поиска. Тогда это единственная строка, которую я должен был добавить к моей спецификации:

query.orderBy(builder.desc((root.join(Prodotto_.listaQuoteIng))
                                   .get(QuotaIngrediente_.perc_ing)));
...