Я хочу исключить несколько записей в поиске с критериями - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть приложение с рецептами.Рецепты содержат ингредиенты, которые сами имеют пищевые добавки.Я настроил фильтр для восстановления только тех рецептов, в которых есть хотя бы один алимент.Но я застрял, чтобы отфильтровать рецепты, чтобы иметь тот, который имеет только эти алименты.

Я использую пружинную загрузку с JPA.Моя база данных - mySQL. Я уже пытался просто отменить мой запрос, написав: joinIngredients.get ("aliment"). In (aliment) .not ()

Я пытаюсь присоединиться к INNER.без успеха: (

Recipe(recette)
|__Ingredient
   |_Aliment

Рецепт

@Entity
public class Recette implements Serializable {

    //id, etc.

    @OneToMany(cascade = CascadeType.DETACH, mappedBy = "recette", orphanRemoval = true)
    private Collection<Ingredient> ingredients;
}

Ингредиент

@Entity
public class Ingredient implements Serializable {

    @ManyToOne
    @JsonIgnore
    @JoinColumn(name="idRecette") 
    private Recette recette;

    @OneToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "idAliment")
    private Aliment aliment;
}

Алимент

@Entity
public class Aliment implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private long idAliment;

    @Column(columnDefinition = "VARCHAR(40)", unique=true)
    private String nom;
}

Метод Recette.repo: Если ifа остальные дают те же мысли !!

public Predicate toPredicate(Root<Recette> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
    query.orderBy(criteriaBuilder.asc(root.get("titre"))).distinct(true);
    List<Predicate> predicates = new ArrayList<>();
    //others predicates


    if (!aliments.isEmpty()) {
        Join<Recette, Ingredient> joinIngredients = root.join("ingredients", JoinType.LEFT);
        if (exclusiveAlimentsWanted) {
             List<Aliment> alimentsNotWanted = alimentSrv.findAll();
             for(Aliment aliment : aliments) {
                 alimentsNotWanted.remove(aliment);
             }
             predicates.add(
                 joinIngredients.get("aliment").in(alimentsNotWanted).not()
             );
        }else{
            predicates.add(
                joinIngredients.get("aliment").in(aliments)
            );
        };
    }

    return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])) ;
}           

У меня есть четыре рецепта:

  • 1 с мукой.
  • 2 с мукой и яйцами.
  • 3 с яйцом и молоком
  • 4 с мукой, яйцом и молоком.

Если я просто выберу муку, у меня есть рецепты 1, 2 и 4ОК.

Если я также выберу "exclusiveAlimentsWanted", я просто хочу рецепт 1, но у меня все еще есть рецепты 1, 2 и 4. KO.

Я фильтрую напрямую с помощью предикатов при построениизапросы к базе данных. (Извините, если я не использую правильные слова, я помогаю Google перевести, хихи)

Мое приложение в настоящее время мало для моей семьи, но если оно работает, у меня есть много рецептов.1000.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...