2010-09-16 53 views
25

我以为我知道如何使用JOINJPQL但显然不是。谁能帮我?JPA:加入JPQL

select b.fname, b.lname from Users b JOIN Groups c where c.groupName = :groupName 

这让我异常

org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query 
Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException 

UsersGroups一个一对多的关系。

Users.java

@Entity 
public class Users implements Serializable{ 

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL) 
    List<Groups> groups = null; 
} 

Groups.java

@Entity 
public class Groups implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="USERID") 
    private Users user; 
} 

我的第二个问题是我们说的这个查询返回唯一结果,那么如果我做

String temp = (String) em.createNamedQuery("***") 
    .setParameter("groupName", groupName) 
    .getSingleResult(); 

***表示上面的查询名称。 fnamelname连在一起temp或我得到List<String>回来?

回答

43

加入上看起来一个一对多的JPQL关系如下:

select b.fname, b.lname from Users b JOIN b.groups c where c.groupName = :groupName 

当几个性质select条款的规定,结果返回Object[]

Object[] temp = (Object[]) em.createNamedQuery("...") 
    .setParameter("groupName", groupName) 
    .getSingleResult(); 
String fname = (String) temp[0]; 
String lname = (String) temp[1]; 

顺便说一句,为什么你的实体以复数形式命名,这是令人困惑的。如果你想在复数的表名,你可以使用@Table指定明确的实体表名,所以它不会保留字的干扰:

@Entity @Table(name = "Users")  
public class User implements Serializable { ... } 
+1

如果不是选择字段,你选择什么实体+另一个实体的字段。就像'SELECT b,c.name ...'。那么Object []中的第一个对象将是b或整个实体的字段? – Ced 2015-09-21 18:25:05