【问题标题】:Pass table name to @Table annotation of entity at runtime Hibernate在 Hibernate 运行时将表名传递给实体的 @Table 注释
【发布时间】:2016-01-19 09:51:32
【问题描述】:

我有下一个问题:我在数据库中有几个表,不知何故我需要从其中一个表中进行查询,但只有在运行时我才会知道所需表的名称,所以是否有可能通过表名到运行时实体的@Table 注释?所有这些表都具有完全相同的架构。唯一的区别 - 是名称(BILLING_DATA_2016_1、BILLING_DATA_2015_12 等)。有人知道如何动态传递表的名称吗?或者可能是查询和继承的一些技巧?

【问题讨论】:

  • 我认为这取决于您何时可以确定表名,我不太确定您如何多次执行此操作,但您当然可以使用 SpEL 设置一次,您的应用程序是否需要设置表名一次还是多次?
  • 不幸的是多次。表名称取决于在客户端设置的时间段,因此在每个新请求中我都需要更新 @Table 注释
  • 我认为你无法解决这个问题。如果您无法更改架构,请考虑与您建议的相反:创建所有数据表的统一数据库视图(基于联合查询)并将实体映射到此。使用标准日期运算符查询此实体。
  • @AlanHay,这似乎是解决问题的最佳变体......谢谢

标签: java mysql hibernate jpa


【解决方案1】:

你可以试试 HibernateInterceptor。将 {BILLING_DATA_PLACEHOLDER} 字符串放入您的 @Table 注释中,然后即时替换它

public class HibernateInterceptor extends EmptyInterceptor {
@Override
    public String onPrepareStatement(String sql) {
          String prepedStatement = super.onPrepareStatement(sql);
          prepedStatement = prepedStatement.replaceAll("{BILLING_DATA_PLACEHOLDER}", theRealSchemaName);
          return prepedStatement;
    }
}

没试过

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多