带Eclipselink的JPA忽略了左外连接和从条件添加错误

带Eclipselink的JPA忽略了左外连接和从条件添加错误,jpa,eclipselink,named-query,Jpa,Eclipselink,Named Query,我有一个菜单实体,它有一个父菜单: public class Menu implements Serializable { ... @JoinColumn(name = "parent" , nullable = true, referencedColumnName = "id") @ManyToOne(targetEntity = Menu.class,fetch = FetchType.EAGER, cascade = {}, optional = true) //@

我有一个菜单实体,它有一个父菜单:

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创建了一个carthesian产品

有什么问题?为什么要添加t2


我还添加了JoinFetch注释,但它被忽略了,我现在不知道为什么。

T1来自您的外部联接关系,SQL显示它正确地用于引入与您的查询正在选择的菜单实例关联的所有父实例

带有t2的笛卡尔积是您通过查询“从菜单m左外连接菜单mp中选择m”定义的。查询应该是:

SELECT m FROM Menu m WHERE m.applicazione.id = :idapp ORDER BY m.ordine ASC
如果必须使用父关系进行排序,则其形式如下:

SELECT m FROM Menu m LEFT OUTER JOIN m.parent mp WHERE m.applicazione.id = :idapp 
ORDER BY mp.id ASC NULLS FIRST, m.ordine ASC
请注意,SQL可能有一个额外的表联接,因为行为是特定于提供程序和映射的-在筛选中不使用fetch联接,因为它会扭曲返回对象的结果

SELECT m FROM Menu m WHERE m.applicazione.id = :idapp 
ORDER BY m.parent ASC NULLS FIRST, m.ordine ASC

也可以在EclipseLink中工作,因为它在菜单中有fk,无需触发联接,但不是必需的。

是的,我忘记了mp已联接到其父表,所以T2。我使用了最后一个查询。我做的另一个更改是删除@JoinFetch并使用@BatchFetch(JOIN)