首页 > 解决方案 > Hibernate SQLGrammarException on join table

问题描述

I have three tables: user, group and membership. The membership table is the joining table of the users and groups as users can be a member in multiple groups and vica versa.

I have a Spring Boot application in which I would like to access the groups of a certain user.

User class

@Entity
public class User {
    /* members */

    @OneToMany
    @JoinTable(
            name = "membership",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "group_id")
    )
    private Set<Group> groups;

    public Set<Group> getGroups() {
        return groups;
    }

    /* getters, setters */
}

Group class

@Entity
public class Group {
    /* members */

    @OneToMany
    @JoinTable(
            name = "membership",
            joinColumns = @JoinColumn(name = "group_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id")
    )
    private Set<User> users;

    public Set<User> getUsers() {
        return users;
    }

    /* getters, setters */
}

Usage

Integer id;

User user = userRepository.findById(id).get();

Set<Group> groups = user.getGroups();

When I debug the code, I get the following error:

Unable to evaluate the expression Method threw 'org.hibernate.exception.SQLGrammarException' exception.

I am a beginner to both Spring Boot and Hibernate.

Thank you.

标签: javahibernatespring-boot

解决方案


事实证明,我使用 MySQL 服务器这一事实很重要。显示原始 SQL 查询时,该group表没有特殊的封闭撇号。这样 MySQL 服务器就认为这group是一个错误的group by语句。

用封闭的撇号明确说明表名可以解决问题。

@Table(name = "`group`")
public class Group {
    /* some code */
}

推荐阅读