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

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


person Thang Pham    schedule 16.09.2010    source источник


Ответы (1)


Присоединение к отношению «один ко многим» в 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 { ... } 
person axtavt    schedule 16.09.2010
comment
Что, если вместо выбора полей вы выбрали сущность + поле из другой сущности. Что-то вроде SELECT b , c.name .... Тогда первым объектом в Object[] будет поле b или вся сущность? - person Ced; 21.09.2015