如何让Hibernate生成查询时不使用自动生成的别名?
解决Hibernate 6.1生成SQL时使用表名而非自动别名的问题
问题背景
当前Hibernate 6.1生成的SQL会使用自动生成的短别名(如r1_0),示例:
select r1_0.id,r1_0.name from roles r1_0 where r1_0.name=?
希望生成可读性更高、直接使用表名作为前缀的SQL:
select roles.id,roles.name from roles where roles.name=?
已配置实体类的@Entity(name = "roles")和@Table(name = "roles"),但尝试的hibernate.use_alias_for_entity_reference = false配置在Hibernate 6.1中无效且文档不存在。
解决办法
1. 使用Hibernate 6.x支持的专属配置
替换无效配置为Hibernate 6.x新增的查询别名配置,在持久化配置文件(application.properties/application.yml/persistence.xml)中添加:
- Properties格式:
hibernate.query.alias_prefer_entity_names=true - YAML格式:
hibernate: query: alias_prefer_entity_names: true
2. 确认实体类配置
你的Role实体已经正确将@Entity的name属性设置为表名roles,这是配置生效的前提,无需额外修改:
@Entity(name = "roles") @Table(name = "roles") @Data public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Enumerated(EnumType.STRING) @Column private ERole name; public Role() {}; public Role(@NonNull ERole role) { this.name = role; }; }
3. 预期效果
配置生效后,Hibernate生成的SQL会变为:
select roles.id, roles.name from roles roles where roles.name=?
虽然from子句中会出现roles roles(表名+别名),但查询字段和条件均使用roles作为前缀,完全满足可读性需求。
注:Hibernate 6.x目前没有配置可以完全移除
from后的别名,因为这涉及内部查询解析的强制逻辑,但上述方案已经能达到你追求的易读性目标。
内容的提问来源于stack exchange,提问作者Aspiring Dev 23000
相关产品推荐
相关产品推荐

