[英]Dyamic table name for JPQL / Hibernate query
我有一個數據庫,其中包含已(並將繼續)使用命名策略創建的數千個表 - 每個日歷日一個表:
所有表格都包含來自相同系統的相同形狀的傳感器數據。 因此,單個實體(我們稱之為 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.