2010-09-16 45 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