Подтвердить что ты не робот

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 или я получаю a List<String> назад?

4b9b3361

Ответ 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 { ... }