У меня есть приложение с рецептами.Рецепты содержат ингредиенты, которые сами имеют пищевые добавки.Я настроил фильтр для восстановления только тех рецептов, в которых есть хотя бы один алимент.Но я застрял, чтобы отфильтровать рецепты, чтобы иметь тот, который имеет только эти алименты.
Я использую пружинную загрузку с 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.
Спасибо