2016-10-11 77 views
1
List<Users> temp2; 
temp2 = em.createQuery("SELECT u FROM Users u " 
     + "NATURAL LEFT JOIN CourseMembers b " 
     + "WHERE b.courseMembersPK.userID IS NULL").getResultList(); 

嗨!如果在另一个表中没有记录(CourseMembers),我试图获取所有用户对象。你可以在JPA SQL javaEE中做自然左连接吗?

但我从我的EJB收到此错误:

Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.2.qualifier): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing [SELECT u FROM Users u NATURAL LEFT JOIN CourseMembers b WHERE b.courseMembersPK.userID IS NULL]. 
[21, 22] The FROM clause has 'Users u' and 'NATURAL LEFT JOIN CourseMembers b' that are not separated by a comma. 
[30, 30] An identification variable must be provided for a range variable declaration. 

我试图用逗号,但它给了我另一个错误。我该如何解决这个问题?

+1

在此查询语言中,您必须使用对象结构。 – Jens

+0

所以你不允许使用join? –

+0

你可以使用连接。但不自然加入 – Jens

回答

1

我想你有一个场景,你想让所有不是成员/订阅任何课程的用户。

首先,你应该创建UserCourseMembers实体之间的OneToMany关系:

你应该有类似的User实体:

... 
private Set<CourseMembers> courseMembers; 
... 
@OneToMany(fetch = FetchType.EAGER, mappedBy="user") 
public Set<CourseMembers> getCourseMembers() { 
    return this.courseMembers; 
} 
... 

然后,你需要的CourseMembers之间的ManyToOne关系和User

CourseMembers实体中,您HOULD有类似:

... 
private User user; 
... 
@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name="USER_ID", nullable=false) 
public User getUser() { 
    return this.user; 
} 
... 

,然后在你的查询,你可以使用:

FROM User u WHERE u.courseMembers IS EMPTY 

希望这有助于。