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からの取得はできません。
ormliteのQueryBuilderはまだ結構出来ない操作が多いので、ある程度複雑なqueryを書きたい場合は素直にSQLを書いた方が早いですね。