JPQL / Hibernateクエリの動的テーブル名

そして:

命名戦略を使用して作成された(そして作成され続ける)何千ものテーブルがデータベースにあります-暦日に1テーブル:

  • 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);

しかし、それはそうではなく、トピックの周りを読むことは私が間違った道にいることを示唆しているようです。動的命名に関するほとんどの投稿では、テーブルごとに1つのエンティティが必要であると明示的に述べられているようですが、何千もの重複エンティティを生成することも間違っているようです。

JPA(JPQL?)を使用して、テーブル名が命名規則に従い、クエリの一部として変更できるこのデータをどのように使用できますか?

alex valuiskyi:

パラメータは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;
   }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事