web-dev-qa-db-ja.com

@Table(name = "tableName")-"tableName"をJPAの変数にする

JPAを使用していて、「tableName」を変数にする必要があります。

データベースには多くのテーブルがあり、コードは、読み取るために指定したテーブルにアクセスする必要があります。

@Entity
@Table(name = "tableName")
public class Database implements Serializable {...............}

何か案は?

15
zengr

あなたはこのようなことをすることができます、それがあなたの懸念であれば、私は推測します。 これを試したことがない、とんでもない推測しかし、それが通常の慣行です-名前付きクエリについては私が従います。はい、それはまったく別のものです。

@Entity
@Table(name = Database.tableName)
public class Database implements Serializable {
    public static final String tableName = "TABLE_1";
    ...............
}

しかし、なぜそれを行うのかはわかりません。今何してるの?まったく同じ定義のテーブルが少ないのはなぜですか?

[編集済み]

私はあなたの解決策を試しました。それは機能しなかった、それは言う:注釈属性Table.nameの値は定数式でなければならない。

それで、それは十分に明確ではありませんか?あなたはそれができないということです。そして、私はそれが非常に論理的であると信じています。 Hibernateでスキーマを生成する場合は、スキーマ内で、適切な関係を使用して、必要なすべてのエンティティを定義できます。

6
Adeel Ansari

テーブル名だけを参照/読みたい場合は、以下のコードのように可能です。パスカルが言ったように、変更したい場合は不可能です。

@Entity
@Table(name = Database.tableName)
public class Database implements Serializable {
    public static final String tableName = "TABLE_1";//this variable you can reference in other portions of your code. Of course you cannot change it.
    ...............
}
3
Andrei I

実行時にテーブル名を指定することはできません。これは単にJPAが機能する方法ではありません(そして、私はまだあなたの要件を得るのか確信がありません)。クライアントのサイドからの入力に応じて、テーブルセットにさまざまなエンティティをマップしてさまざまなクエリを実行するか、動的に構築する(おそらくCriteria APIを使用)or JPA以外のもの(iBATISなど)を使用します。

2
Pascal Thivent

回避策があります。
それは、javax.persistence.EntityManagerとString.formatを使用して行われます。

package com.example.test.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import Java.util.List;
import javax.persistence.EntityManager;

@Component
public class SomeDao {
    @Autowired
    EntityManager em;

    public List<?> listFoodMoneyDateOfPayment(int departmentId, String sumKey, String tableName) {
        String s = "SELECT SUM(%s) AS money, CONCAT(YEAR(apply_time), '-', MONTH(apply_time)) AS yearmonth " +
                "FROM (%s) WHERE department_id = %d GROUP BY yearmonth";
        String sql = String.format(s, sumKey, tableName, departmentId);
        System.out.println(sql);

        List<?> test = em.createNativeQuery(sql).getResultList();

        return test;
    }
}

呼び出しコードは次のとおりです。

@RestController
@RequestMapping("/api")
public class TestController {

    @Autowired
    private SomeDao dao;

    @RequestMapping("/test2")
    public HttpEntity test2() {
        var l = dao.listFoodMoneyDateOfPayment(12, "food_payment", "payment_application");
        System.out.println(l.getClass());
        System.out.println(JSON.toJSONString(l));
        return ResultBean.success();
    }
}

そして、それはうまくいきます。
しかし、渡された引数を確認する必要があります。

0
HumbertZhang

別のテーブルからデータを選択する場合は、

それからあなたは使うことができます:

@Subselect("")

の代わりに :

@Table(name = "tableName")

0
Alex85