4

次のようなクエリを起動する必要があるとしましょう。

Select primarykey, columnname, old_value, new_value from first_audit_log;

Select primarykey, columnname, old_value, new_value from second_audit_log;

Select primarykey, columnname, old_value, new_value from third_audit_log; ...so on

audit_logはどのクラスにも JPA エンティティとしてマップされておらず、 number of の number of クラスを厳密に作成することはできませnん。n*_audit_logs

ネイティブクエリ機能を使用して、これをジェネリッククラスにマップするにはどうすればよいですか? 新しい機能を選択しようとしていますが、よくわかりません... したがって、どんな助けも大歓迎です。

4

2 に答える 2

3

監査ログ テーブルは同じ列を共有するため、これらのテーブルを「統合」するビューを作成し、単一の Java クラスをそのビューにマップできます。更新を書く必要がないので、できると思います。

別の方法として、ネイティブ クエリを使用することをお勧めします。

編集

1) 監査ログが既にビューである場合、ビューごとにマッピング Java クラスを作成したくない場合は、他のビューに基づいてビューを作成できます。1行が「最初の」監査ログからのものである2場合、それが 2 番目のものからのものである場合など、値を持つダミーの列を追加することを忘れないでください。そうすれば、それらを区別することができます。

2) ネイティブ クエリを使用するには、永続化プロバイダーが Hibernate であると仮定すると、次の例のように実行できます。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();

Session sess = em.unwrap(Session.class); // <-- Use Hibernate-specific features
SQLQuery query = sess.createSQLQuery(
   "SELECT AVG(age) AS averageAge, AVG(salary) as averageSalary FROM persons");

query.setResultTransformer(Transformers.aliasToBean(MyResult.class));
MyResult result = (MyResult) query.list().get(0);

whereMyResultは次のように宣言されます。

public class MyResult {

    private BigDecimal averageAge;
    private BigDecimal averageSalary;

    public BigDecimal getAverageAge() {
        return averageAge;
    }
    public void setAverageAge(BigDecimal averageAge) {
        this.averageAge = averageAge;
    }
    public BigDecimal getAverageSalary() {
        return averageSalary;
    }
    public void setAverageSalary(BigDecimal averageSalary) {
        this.averageSalary = averageSalary;
    }

}

テーブルは次のようになりpersonsます (MySQL 構文):

CREATE TABLE `persons` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) NOT NULL,
  `lastname` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `salary` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

この例を必要に応じて簡単に変更できます。personsとを必要なMyResultものに置き換えるだけです。

于 2013-03-05T17:02:32.167 に答える