JPQL MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL - PullRequest
2 голосов
/ 05 сентября 2010

У меня есть две сущности: Пользователь и Группа:

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private String username;
    private String password;
    private String email;
    @ManyToMany
    @JoinTable(name="user_group", joinColumns={@JoinColumn(name="USERNAME")}, inverseJoinColumns={@JoinColumn(name="ID")})
    private List<Group> group;

    // getters and setters...
}

@Entity
public class Group implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private String id;

    // getters and setters...
}

Это однонаправленный ManyToMany. Он производит таблицы user и user_group. Теперь у меня есть простой запрос:

Query q = em.createQuery("select g from Group g");
List<Group> usersGroup = q.getResultList();

который выдает исключение:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP' at line 1
Error Code: 1064
Call: SELECT ID FROM GROUP
Query: ReadAllQuery(referenceClass=Group sql="SELECT ID FROM GROUP")
... stack trace...

Ответы [ 2 ]

5 голосов
/ 06 сентября 2010

Вы МОЖЕТЕ использовать Group или User для объектов базы данных, если вы сообщаете провайдеру JPA, что эти имена должны интерпретироваться как идентификаторы с разделителями.

В JPA 2.0 и аннотациях имя указывается в качестве идентификатора с разделителями, заключая имя в двойные кавычки, причем внутренние кавычки экранируются:

@Entity
@Table(name="\"User\"")
public class User implements Serializable {
    ...
}

@Entity
@Table(name="\"Group\"")
public class Group implements Serializable {
    ...
}

Ссылка

  • Спецификация JPA 2.0
    • Раздел 2.13 «Наименование объектов базы данных»
2 голосов
/ 05 сентября 2010

Не называйте вашу группу пользователей «Группой». Это будет зарезервированное слово в синтаксисе MySQL для использования в агрегировании как GROUP BY .

Попробуйте назвать это как-нибудь еще, например, «UserGroup».

...