2011-04-26 51 views
2

我正在使用以下查询获取与用户链接的所有水果。JPQL:使用继承的以下WHERE子句的问题

return (List<Fruit>) getEm() 
      .createQuery(
        "SELECT DISTINCT f FROM Fruit f, User u WHERE (f = u.apples OR f = u.oranges OR f = u.mangos) AND u.id = :id") 
      .setParameter("id", id).getResultList(); 

相应实体如下:

public class Fruit{ 

private int id; 

}

public class User{ 

private int id; 
private Collection<Apple> apples; 
private Collection<Orange> oranges; 
private Collection<Mango> mangos; 

}

public class Mango extends Fruit{ 

private int id; 
... 

}

public class Apple extends Fruit{ 

private int id; 
... 

}

public class Orange extends Fruit{ 

private int id; 
... 

}

的问题是,上述查询不给我一个结果,如果有收藏的不存在的用户。所以,如果用户没有苹果,我不会得到0作为结果。我已经尝试用u.apples IS NOT EMPTY等语句来捕捉错误,但它也可以解决问题。

那么,你能否给我一个这种情况下的提示?整个事情会更容易,如果水果将与用户有一对多的关系,但不幸的是我不能承受这个程序...

在此先感谢!

回答

0

怀疑你想要IN而不是=,但像“无法承担这个程序”这样的短语让我紧张,有很多被黑客入侵的东西正在进行。

1

您的JPQL无效,所以我不确定它是如何工作的。

您只能使用“。” ToOne上的符号而不是ToMany,对于ToMany,您需要使用连接。对于联接,您可以使用外部联接来允许任何联接。

SELECT DISTINCT f FROM Fruit f, User u left join u.apples a ... WHERE f = a or ...