簡體   English   中英

JPQL/Hibernate 查詢的動態表名

[英]Dyamic table name for JPQL / Hibernate query

我有一個數據庫,其中包含已(並將繼續)使用命名策略創建的數千個表 - 每個日歷日一個表:

  • 數據_2010_01_01
  • 數據_2010_01_02
  • ...
  • 數據_2020_01_01

所有表格都包含來自相同系統的相同形狀的傳感器數據。 因此,單個實體(我們稱之為 SensorRecord)將絕對映射到所有表。

我想象過這樣的事情會起作用:

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

但事實並非如此,閱讀該主題似乎表明我走上了錯誤的道路。 大多數關於動態命名的帖子似乎明確指出每個表需要一個實體,但生成數千個重復實體似乎也是錯誤的。

如何使用 JPA (JPQL?) 處理這些數據,其中表名遵循命名約定並且可以作為查詢的一部分進行更改?

參數只允許在 where 子句中。 您可以創建自定義存儲庫方法返回SensorRecord dto 的集合。 無需映射這么多實體。 您應該將List<Object []>作為查詢結果並手動創建 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;
   }

難道只是語法錯誤?

這對我有用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM