JPA: ПРИСОЕДИНЯЙТЕСЬ к JPQL - PullRequest
       15

JPA: ПРИСОЕДИНЯЙТЕСЬ к JPQL

34 голосов
/ 17 сентября 2010

Я думал, что знаю, как использовать JOIN в 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

Users имеет отношение 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;
}

Мой второй вопрос: пусть этот запрос вернет уникальный результат, тогда, если я сделаю

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

*** представляет имя запроса выше.Так что же fname и lname объединены внутри temp или я получу List<String> обратно?

1 Ответ

57 голосов
/ 17 сентября 2010

Объединение по отношению один-ко-многим в 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 { ... } 
...