java - 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.
解决方案
事实证明,我使用 MySQL 服务器这一事实很重要。显示原始 SQL 查询时,该group
表没有特殊的封闭撇号。这样 MySQL 服务器就认为这group
是一个错误的group by
语句。
用封闭的撇号明确说明表名可以解决问题。
@Table(name = "`group`")
public class Group {
/* some code */
}
推荐阅读
- bash - 运行包含失败的 vscode 任务
- android - 未连接适配器;在 MVVM 架构中恢复片段后在 Recycler Vierw 中跳过布局问题
- python - 使用 Python 使用 Keras 进行深度学习的介绍部分
- python - SQL - 有条件地连接和替换两个表之间的值
- sockets - 从套接字双重读取
- tuleap - 从 Tuleap Sprint 菜单中删除任务
- html - Bootstrap,使用嵌套网格在卡片标题中显示标题和表单按钮
- javascript - 播放后删除“.animated”类,并在元素重新加载时将其添加回来。纯Javascript
- python - 4D NumPy 数组中每个 2D 矩阵的最大值
- javascript - 对于构造函数的原型属性未设置为对象的实例,这是默认行为吗?