У меня есть объект Menu, у которого есть родительское меню:
public class Menu implements Serializable {
...
@JoinColumn(name = "parent" , nullable = true, referencedColumnName = "id")
@ManyToOne(targetEntity = Menu.class,fetch = FetchType.EAGER, cascade = {}, optional = true)
//@BatchFetch(BatchFetchType.JOIN)
@JoinFetch(JoinFetchType.OUTER)
private Menu parent;
...
}
Я бы создал запрос:
SELECT m.*
FROM menu m LEFT OUTER JOIN menu p ON (p.ID = m.parent)
WHERE (m.idapp = 1) ORDER BY p.ID ASC NULLS FIRST, m.order ASC
У меня есть именованный запрос:
SELECT m FROM Menu m LEFT OUTER JOIN Menu mp
WHERE m.applicazione.id = :idapp
ORDER BY mp.id ASC NULLS FIRST, m.ordine ASC
но результат таков:
SELECT ...
FROM menu t1 LEFT OUTER JOIN menu t0 ON (t0.ID = t1.parent), menu t2
WHERE (t1.idapp = ?) ORDER BY t2.ID ASC NULLS FIRST, t1.order ASC
Это совершенно неправильно, потому что таблица t2 createa carthesian product.
В чем проблема? Почему t2 добавлено?
Я также добавил аннотацию JoinFetch, но она игнорируется, и я не знаю почему.