LoginSignup
2

More than 5 years have passed since last update.

Ebeanでテーブル一覧(show tables)を取得する

Posted at

誰得かもしれませんが、ebeanでshow tablesのSQLコマンドを叩き、テーブル名をJSONで取得するやり方をご紹介します。

開発環境

Java8
Play Framework 2.5.1(Java)
sbt 0.13.11

DB構成

DB名: sample_db

テーブル名:
・tweet
・user

モデルの操作は、Playに同梱されているEbeanと呼ばれるORMを利用します

Controller

ここではSampleControllerというコントローラー内のgetTables関数に処理を記述しておきます。

//app/controllers/SampleController.java

public Result getTables() {
        String sql = "show tables;";

        List<SqlRow> sqlRows = Ebean.createSqlQuery(sql).findList();
        List<String> tables = new ArrayList<String>();

        sqlRows.forEach((row) -> {
            tables.add(row.getString("tables_in_sample_db").toString());
        });

        JsonNode json = Json.toJson(tables);
        return ok(json);
}

ルーティング

GET    /tables     controllers.SampleController.getTables

これだけでOKです

見てみよう

あとはcurlでAPIを叩いて確認しましょう。

curl "localhost:9000/tables"

value部にちゃんとテーブル名が取得出来ているのが確認出来ました。

["tweet","user"]

ポイント

実装を見てお気づきかもしれませんが、今回の実装では、findListメソッドで取得したSqlRow型Listの結果をそのまま返さず、forEachで新たに作成したString型のListをJSONで返却しました。

これはSqlRowをそのまま返却すると以下のように、カラム名=valueのようなフォーマットで返されてしまうからです。

[{"tables_in_sample_db":"tweet"},{"tables_in_sample_db":"user"}]

tables_in_hogehoge が必要な場面があるのかはその業務によりけりですが、単純にDBからテーブル名だけを取得したい場合は、新たにListを作ってgetStringメソッドでString化したValueを格納する作業が必要です。

参考記事

Java Play framework 2.0で、ebeanを利用した直接SQL
クラス SqlRow

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2