You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Filter条件中{h-schema}占位符未解析问题咨询

关于Hibernate @Filter中{h-schema}占位符未解析的问题

我有一个带版本控制的领域实体,用UUID标识,存在多个版本记录。为了快速获取最新版本,我给实体添加了MyTable.current过滤器,但过滤器条件里的{h-schema}占位符没有被自动解析,得手动指定模式;但同样的条件用到@Formula注解的latestRevision属性时,这个占位符却能正常解析。想知道这是Hibernate的设计如此,还是@Filter的条件本该和@Formula一样支持该占位符解析?

实体代码

@Entity
@Table(name = "my_table")
@FilterDef(name = "MyTable.current")
@Filter(name = "MyTable.current", condition = """
    revision_number = (select max(v.revision_number) from {h-schema}my_table as v where id = v.id)
            """)
public class MyRevisioneEntity extends PanacheEntityBase {
  @Id
  /* This is NOT autogenerated */
  UUID id;
  @Id
  @Column(name = "revision_number")
  long revision;
  @Basic(fetch = FetchType.LAZY)
  @Formula("(revision_number = (select max(v.revision_number) from {h-schema}my_table as v where id = v.id))")
  boolean latestRevision;
  // ... metadata, target of revision!
}

解答

这是Hibernate的设计差异,并非功能Bug:

  • @Formula的表达式会完全融入Hibernate的SQL生成流程,天然支持{h-schema}这类占位符解析——因为它是和实体属性绑定的计算逻辑,必须和表结构的上下文保持一致。
  • 而@Filter的条件在初始化阶段就被当作静态SQL片段处理,Hibernate默认不会解析其中的占位符。过滤器的设计目标是提供通用的动态过滤规则,它的条件文本会直接拼接进最终SQL,除非你手动介入处理占位符替换。

如果要让@Filter支持schema占位符,可参考两种解决方案:

  1. 手动拼接schema名称:从Hibernate配置中读取hibernate.default_schema的值,直接写入过滤器条件,或者通过配置注入的方式动态传入。
  2. 自定义过滤器实现:扩展FilterDefinition,在过滤器生效前手动将{h-schema}替换为实际的schema名称。

内容的提问来源于stack exchange,提问作者Luca Basso Ricci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:22:34