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占位符,可参考两种解决方案:
- 手动拼接schema名称:从Hibernate配置中读取
hibernate.default_schema的值,直接写入过滤器条件,或者通过配置注入的方式动态传入。 - 自定义过滤器实现:扩展
FilterDefinition,在过滤器生效前手动将{h-schema}替换为实际的schema名称。
内容的提问来源于stack exchange,提问作者Luca Basso Ricci
相关产品推荐
相关产品推荐

