2010-09-16 56 views
25

Tôi nghĩ tôi biết cách sử dụng JOIN trong JPQL nhưng dường như không. Ai giúp tôi với?JPA: THAM GIA trong JPQL

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

này cho tôi Exception

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

Users có mối quan hệ với OneToMany Groups.

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; 
} 

câu hỏi thứ hai của tôi là hãy nói truy vấn này trả về một kết quả độc đáo, sau đó nếu tôi làm

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

*** đại diện cho tên truy vấn trên . Vì vậy, fnamelname được ghép lại với nhau bên trong temp hoặc tôi nhận được List<String> trở lại?

Trả lời

43

Tham gia vào một-nhiều mối quan hệ trong JPQL trông như sau:

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

Khi có nhiều tài sản được quy định tại select khoản, kết quả được trả về như Object[]:

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

Bằng cách này , tại sao các thực thể của bạn được đặt tên theo dạng số nhiều, nó khó hiểu. Nếu bạn muốn có tên trong bảng số nhiều, bạn có thể sử dụng @Table để chỉ định tên bảng cho đơn vị một cách rõ ràng, vì vậy nó không can thiệp với các từ dành riêng:

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

gì nếu thay vì chọn trường bạn chọn một thực thể + một trường từ một thực thể khác. Một cái gì đó như 'SELECT b, c.name ...'. Sau đó, đối tượng đầu tiên trong Object [] sẽ là một trường của b hoặc toàn bộ thực thể? – Ced

Các vấn đề liên quan