NamedQuery连接和过滤器集合

时间:2014-03-06 15:51:19

标签: java jpql named-query

我尝试过这个查询,但它仍然会选择每个孩子,即使我只想要具有特定名称的孩子。我将如何实现这一目标?

@NamedQuery(name="Parent.getChildrenWithName",
                query="SELECT p FROM Parent p "
                        + "join p.children c "
                        + "where c.name = :childName")
public class Parent
{
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "parentId")
    private List<Child> children;
}

public class Child
{
    @Column(name = "ChildName")
    private String childName;

    private int parentId;
}

请在http://docs.oracle.com/javaee/6/tutorial/doc/bnbtl.html#bnbtr上阅读:

表达式无法超越(或进一步限定)作为集合的关系字段。在表达式的语法中,集合值字段是终端符号。因为teams字段是一个集合,所以WHERE子句不能指定p.teams.city(非法表达式)。

这是我获取结果的代码:

TypedQuery<Parent> query = em.createNamedQuery("Parent.getChildrenWithName", Parent.class);
query.setParameter("childName", "Daniel");
Parent parent = query.getSingleResult();

但问题仍然存在:)

1 个答案:

答案 0 :(得分:0)

更改您的代码,如下所示

    TypedQuery<Parent> query = em.createNamedQuery("Parent.getChildrenWithName", Parent.class);
    query.setParameter("childName", "Daniel");
    Parent parent = query.getSingleResult();