JPA:加入JPQL

Tha*_*ham 35 java jpa eclipselink jpql

我以为我知道如何使用JOIN,JPQL但显然不是.谁能帮我?

select b.fname, b.lname from Users b JOIN Groups c where c.groupName = :groupName
Run Code Online (Sandbox Code Playgroud)

这给了我例外

org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query
Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException
Run Code Online (Sandbox Code Playgroud)

Users与...有OneToMany关系Groups.

Users.java

@Entity
public class Users implements Serializable{

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

Groups.java

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

我的第二个问题是让这个查询返回一个唯一的结果,如果我这样做

String temp = (String) em.createNamedQuery("***")
    .setParameter("groupName", groupName)
    .getSingleResult();
Run Code Online (Sandbox Code Playgroud)

***代表上面的查询名称.所以确实fnamelname内部连接在一起temp或者我拿到List<String>回来?

axt*_*avt 60

加入JPQL中的一对多关系如下:

select b.fname, b.lname from Users b JOIN b.groups c where c.groupName = :groupName 
Run Code Online (Sandbox Code Playgroud)

select子句中指定了多个属性时,结果将返回为Object[]:

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

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

@Entity @Table(name = "Users")     
public class User implements Serializable { ... } 
Run Code Online (Sandbox Code Playgroud)

  • 如果不是选择字段而是选择实体+来自另一个实体的字段,该怎么办?像`SELECT b,c.name ...`这样的东西.那么Object []中的第一个对象是b的字段还是整个实体? (3认同)