Spring Data JPA - niepodmapowana tabela przy wywołaniu zapytania

0

Cześć,
Mam relację wiele do wielu na tabelach pizza i ingredients z tabelą asocjacyjną pizza_ing, która przechowuje relacje miedzy dwoma obiektami. Tabela asocjacyjna nie jest encją, tworzona jest automatycznie. Potrzebuję wyciągnąć do listy składników te, które składają się na określony rodzaj pizzy.
Po wrzuceniu:

public interface IngredientDao extends JpaRepository<Ingredient, Integer>{	
	@Query("SELECT ingredient.ingname FROM pizza_ing pi LEFT JOIN ingredient ON pi.ingname = ingredient.id WHERE pizzaname = ?0")
	List<Ingredient> findAllByPizzaId(int id);
}

Dostaję:

org.hibernate.hql.internal.ast.QuerySyntaxException: pizza_ing is not mapped

Z tego co czytam należałoby chyba zaprząc do pracy EntityManagera, ale nie mogę dojść do tego, gdzie to trzeba zdefiniować, w interfejsie? A może jest inne rozwiązanie, który tutaj by pasowało?

2

SELECT i.ingname FROM Pizza p JOIN p.ingredients i

0

pizza_ing powinna być nazwą klasy. Składnik nazwałeś ładnie, więc wydaje mi się że to nie jest encja. Wrzuć kod tych encji które są używane w zapytaniu.

0
@Entity
public class Pizza {

	@Id
	@GeneratedValue
	private int id;

	private String pizzaname;

	@ManyToMany
	@JoinTable(name = "pizza_ing", joinColumns = { @JoinColumn(name = "pizzaname") }, inverseJoinColumns = {
			@JoinColumn(name = "ingname") })
	private List<Ingredient> ingredients;
...
@Entity
public class Ingredient {

	@Id
	@GeneratedValue
	private int id;

	private String ingname;

	@ManyToMany(mappedBy = "ingredients")
	private List<Pizza> pizzas;
...

pizza_ing właśnie nie jest encją, nie ma swojej klasy. Chciałem się uporać bez dokładania kolejnej encji. Jeśli zajdzie taka konieczność dodania to czy wtedy zmienić (pizza) N-N (ingredient) na (pizza) 1-N (pizza_ing) N-1 (ingredient)?

0

Kolumny pośrednie nie mają encji bo nie mają znaczenia biznesowego. Jeżeli operujesz na encjach i mapowaniu ManyToMany to udajesz że tabela pośrednia nie istenieje. Zapytanie @Szczery zadziała prawidłowo i rozwiążę twój problem.

0

@Szczery
Jak dam Twoje zapytanie dostaje:

java.lang.IllegalArgumentException: Parameter with that position [1] did not exist

Jak dam:

SELECT i.ingname FROM Pizza p JOIN p.ingredients i WHERE pizzaname = ?0

dostaję to samo, a jak dam:

SELECT i.ingname FROM Pizza p JOIN p.ingredients i WHERE pizzaname = ?1

To błędu nie ma, ale zwrócona lista jest pusta...

1 użytkowników online, w tym zalogowanych: 0, gości: 1