5

ORMLite を使用して、結合テーブルの条件に基づいてテーブルをクエリしようとしています。

tsql で記述しようとしているクエリを次のように表現します。

select * from media m inner join file f on m.fileId = f.fileId
where m.isNew = 1 OR f.isNew = 1

結果は、メディア レコードまたは対応するファイル レコードのいずれかが isNew = 1 であるメディア レコードのリストになります。

ORMLite での OR の使用に関するドキュメントを読みましたが、すべての例で結合ではなく単一のテーブルが使用されています。同様に、結合に関するドキュメントを読みましたが、両方のテーブルにまたがる where 句が含まれている例はありません。生のクエリ以外にこれを行う方法はありますか?

私はこの質問を見ました:https://stackoverflow.com/a/12629645/874782 同じことを尋ねているようですが、受け入れられた答えはORではなくANDクエリを生成します。その理論をテストするために使用したコードは次のとおりです。

public List<Media> getNewMedia() {
    Session session = getSession();
    Account account = session.getSelectedAccount();
    ContentGroup contentGroup = account.getSelectedContentGroup();

    List<Media> results = null;

    try {

        QueryBuilder<Category, Integer> categoryQueryBuilder = getHelper().getCategoryDao().queryBuilder();
        categoryQueryBuilder.where().eq("group_id", contentGroup.getId());

        QueryBuilder<MediaCategory, Integer> mediaCatQb = getHelper().getMediaCategoryDao().queryBuilder();
        mediaCatQb = mediaCatQb.join(categoryQueryBuilder);

        QueryBuilder<FileRecord, Integer> fileQueryBuilder = getHelper().getFileDao().queryBuilder();
        fileQueryBuilder.where().ge("lastUpdated", contentGroup.getLastDownload());

        QueryBuilder<Media, Integer> mediaQb = getHelper().getMediaDao().queryBuilder();
        mediaQb.where().eq("seen", false);
        // join with the media query
        results = mediaQb.join(fileQueryBuilder).join(mediaCatQb).query();

    } catch (SQLException e) {
        Log.e(TAG, "Sql Exception", e);
    }

    return results;
}

完成させるために、これは上記の例よりも少し複雑な例を照会しています。これを tsql で表現すると、次のようになります。

select * from Media m join FileRecord f on m.fileRecordId = f.fileRecordId
where m.seen = false OR f.lastUpdated >= lastUpdateDate

これを実行すると、実際には AND クエリが実行されます。これは、独立した where 句を持つ 2 つの結合に基づいて期待されるものです。

重要な問題は、そのテーブルに固有の Dao に由来する QueryBuilder オブジェクトで実行されるため、where 句が本質的にテーブルに関連付けられていることだと思います。どうすればこれを回避できますか?

4

1 に答える 1