【问题标题】:NamedQuery join and filter collectionNamedQuery 连接和过滤器集合
【发布时间】:2014-04-09 09:04:31
【问题描述】:

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

@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();

但问题仍然存在:)

【问题讨论】:

  • 您有一个命名查询“Parent.getChildrenWithName”,您的代码的其他部分正在使用它。你能粘贴引用这个命名查询的代码吗?
  • 用该代码编辑了我的问题!
  • 您查询 Child.name (... where c.name = :childName) 但您的实体已将列 ChildName 映射到 persnr。也许您应该改为使用c.persnr 进行查询。也许你在类上有一个属性name,你实际上查询它。

标签: java jpql named-query


【解决方案1】:

如下更改您的代码,

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

【讨论】:

  • 是的,这正是我正在做的事情(除了只有一个父母),但它仍然为我的父母获取所有孩子,而不仅仅是丹尼尔。
  • 有什么区别? :)
  • 当你第一次发布时,如果是一个不同的名字,我想你现在已经编辑了。
  • 是的,抱歉,注意到并改变了这一点。
猜你喜欢
  • 2011-10-27
  • 2015-05-23
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多