Ormliteでのテーブル結合について

   

Androidでローカルのsqliteを操作する際に使うORマッパーとしてはOrmliteというものがあります。
今日は、これを使ってテーブル結合をしようとした話を投稿しようと思います。

結論から先に言うと、現OrmliteのバージョンではQueryBuilderによるSQL生成では外部キーを使用しないJoin操作には対応していませんでした。

公式ドキュメント
http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#Join-Queries

にあるように、QueryBuilderにはjoinメソッドが用意されてはいるのですがDtoのフィールドに外部キーが予め設定されていないと使用できません。

外部キーを使用しないで結合したい場合は、現状ではSQLを書いてやるしかないようです。
仕方がないので、以下のようにSQLを手書きで書いてあげる事にしました。

public List<HogeDto> getAsChannelId(DatabaseHelper helper, int channelId){
        try {
            Dao<HogeDto, Long> dao = helper.getDao(HogeDto.class);

            String sql = "SELECT DISTINCT H1.* FROM HOGE H1 "
                    + "INNER JOIN HOGE2 H2 ON H1.directoryId = H2.id OR H1.directory2ndId = H2.id OR H1.directory3rdId = H2.id  "
                    + "WHERE H2.channelId = ?";
            RawRowMapper<HogeDto> mapper = dao.getRawRowMapper();

            GenericRawResults<HogeDto> result = dao.queryRaw(sql, mapper, String.valueOf(channelId));
            return result.getResults();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

余談ですが、QueryBuilderでの対応も一応されてはされているらしく、探したところgithubにて以下のコミットを発見することができました。
https://github.com/j256/ormlite-core/commit/b37914d76fbbbbbc70d473be1cf1b6de19b847f5

ただ、現状のバージョン4.48ではまだ上記コミットは取り込まれておりません。
いちおう、2016/03/15現在で公式のローカルリポジトリには4.49がスナップショット版として置いてありますがGradleからの取得はできません。

http://ormlite.com/releases/

ormliteのQueryBuilderはまだ結構出来ない操作が多いので、ある程度複雑なqueryを書きたい場合は素直にSQLを書いた方が早いですね。

 - 技術系(アプリ) , , ,