Java 在运行时Hibernate将表名传递给实体的@table注释

Java 在运行时Hibernate将表名传递给实体的@table注释,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我还有一个问题:我在数据库中有几个表,不知何故我需要从其中的一个表中进行查询,但只有在运行时我才能知道所需表的名称,所以是否有可能在运行时将表名传递给实体的@table注释?所有这些表都有完全相同的模式。唯一的区别是名称(计费数据2016 1、计费数据2015 12等)。有人知道如何动态传递表名吗?或者可能是一些查询和继承的黑客 你可以试试HibernateInterceptor。将{BILLING_DATA_PLACEHOLDER}字符串放入@Table注释中,并立即替换它 public cl

我还有一个问题:我在数据库中有几个表,不知何故我需要从其中的一个表中进行查询,但只有在运行时我才能知道所需表的名称,所以是否有可能在运行时将表名传递给实体的@table注释?所有这些表都有完全相同的模式。唯一的区别是名称(计费数据2016 1、计费数据2015 12等)。有人知道如何动态传递表名吗?或者可能是一些查询和继承的黑客

你可以试试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;
    }
}

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