【发布时间】: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