【问题标题】:Dyamic table name for JPQL / Hibernate queryJPQL / Hibernate 查询的动态表名
【发布时间】:2020-01-03 06:32:25
【问题描述】:

我有一个数据库,其中包含已经(并将继续)使用命名策略创建的数千个表 - 每个日历日一个表:

  • data_2010_01_01
  • data_2010_01_02
  • ...
  • data_2020_01_01

所有表格都包含来自同一系统且形状相同的传感器数据。所以单个实体(我们称之为 SensorRecord)绝对会映射到所有表。

我曾想象过这样的事情会奏效:

@Query(nativeQuery = true, value = "SELECT * FROM \"?1\"")
Collection<SensorRecord> findSensorDataForDate(String tableName);

但事实并非如此,围绕该主题阅读似乎表明我走错了路。大多数关于动态命名的帖子似乎都明确指出每个表需要一个实体,但生成数千个重复实体似乎也是错误的。

我如何使用 JPA (JPQL?) 来处理表名遵循命名约定并且可以作为查询的一部分进行更改的数据?

【问题讨论】:

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

参数只允许在 where 子句中。 您可以创建自定义存储库方法返回SensorRecord dto 的集合。无需映射这么多实体。您应该得到 List&lt;Object []&gt; 作为查询结果并手动创建 dto 对象。

    @Autowired 
    EntityManager entityManager;    

    public List<SensorRecord> findSensorDataForDate(LocalDate date) {
           DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM_dd");
           String tableName = "data_" + date.format(formatter);

           Query query = entityManager.createNativeQuery(
                             "select t.first_column, t.second_column from " + tableName + " t");

           List<Object[]> queryResults = query.getResultList();

           List<SensorRecord> sensorRecords = new ArrayList<>();
           for (Object[] row : queryResults) {
               SensorRecord record = new SensorRecord();
               record.setFirstParameter((Integer) row[0]);
               record.setSecondParameter((String) row[1]);

               sensorRecords.add(record);
           }

           return sensorRecords;
   }

【讨论】:

  • 感谢工作示例。这很有帮助。似乎没有办法将表名作为 JPQL 参数,所以这就是我需要的。
【解决方案2】:

会不会只是语法错误?

这对我有用:

    @Query(value = "select * from job where job.locked = 1 and job.user = ?1", nativeQuery = true)
    public List<JobDAO> getJobsForUser(@Param("user") String user);

【讨论】:

  • 这个例子有一个固定的表名“job”。我需要能够更改表名。因此,在您的示例中: select * from job_123 或 select * from job_456 ...
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 2011-07-30
  • 2021-10-31
  • 2019-10-27
  • 1970-01-01
  • 2012-12-05
  • 2014-04-05
  • 2013-02-03
相关资源
最近更新 更多