JPQL/休眠查询的动态表名称



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

  • 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?( 来处理此数据,其中表名遵循命名约定并且可以作为查询的一部分进行更改?

参数只允许在 where 子句中使用。 您可以创建自定义存储库方法返回SensorRecorddto 的集合。无需映射这么多实体。您应该获取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);

最新更新