Hibernate中PostgreSQL@Where注解生成SQL引发跨库引用错误求解
解决Hibernate @Where注解中Schema被错误添加表别名的问题
问题原因
Hibernate解析@Where注解的子查询时,会误将带引号的schema名识别为表名的一部分,错误地在外层表别名后拼接schema,导致PostgreSQL抛出跨库引用的错误。
解决方案
方法1:使用Hibernate内置占位符
借助Hibernate提供的{h-schema}(自动注入配置的schema)和{alias}(代表当前关联表的别名)占位符,避免手动写死schema引发解析错误:
@OneToMany(mappedBy = "account", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @Where(clause = "balance_as_of = (" + "select max(ab.balance_as_of) " + "from {h-schema}account_balance ab " + "where ab.account_id = {alias}.account_id)") private List<AccountBalance> balances;
方法2:通过实体类指定Schema
如果AccountBalance实体类已通过@Table注解指定schema,子查询中直接使用表名即可,Hibernate会自动关联正确的schema:
首先在AccountBalance实体上配置:
@Entity @Table(name = "account_balance", schema = "schema-name") public class AccountBalance { // 实体字段定义 }
再修改@Where注解:
@OneToMany(mappedBy = "account", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @Where(clause = "balance_as_of = (" + "select max(ab.balance_as_of) " + "from account_balance ab " + "where ab.account_id = {alias}.account_id)") private List<AccountBalance> balances;
额外提示
原代码中子查询where account_balance.id = id的逻辑存在问题,仅会筛选当前行的余额时间(与自身相等),无法实现"获取账户最新余额"的需求。上述方案已修正为通过account_id关联,筛选对应账户的最新余额记录。
内容的提问来源于stack exchange,提问作者Mike Toleds
相关产品推荐
相关产品推荐

