3

2つのテーブルで結合し、両方の列をすべて取得しようとしています。これを実行しました。

QueryBuilder<A, Integer> aQb = aDao.queryBuilder();
QueryBuilder<B, Integer> bQb = bDao.queryBuilder();
aQb.join(bQb).prepare();

これは次のようになります。

SELECT 'A'.* FROM A INNER JOIN B WHERE A.id = B.id;

でも私はしたい:

SELECT * FROM A INNER JOIN B WHERE A.id = B.id;

他の問題は、次のように、Bのフィールドで注文する場合です。

aQb.orderBy(B.COLUMN, true);

「テーブル列Bがありません」というエラーが表示されます。

4

2 に答える 2

3

を使用している場合は、オブジェクトQueryBuilderを返すことを期待していBます。A内のすべてのフィールドを含めることはできませんB。それがあなたの言いたいことなら、それは外国のサブフィールドを肉付けしません。その機能は、 ORMLiteのライトバリアを超えていません。

結合テーブルでの注文もサポートされていません。あなたは確かに追加することができますがbQb.orderBy(B.COLUMN, true)、私はそれがあなたが望むことをすることはないと思います。

最適ではありませんが、これには確かにrawクエリを使用できます。

于 2013-01-04T23:52:58.070 に答える
1

実際、クエリ全体を生のクエリとして記述せずに、なんとか実行できました。このように、クエリビルダーコードを置き換える必要はありませんでした(これはかなり複雑です)。それを達成するために、私は次の手順に従いました。

my_tablemy_join_tableの2つのテーブルとそれらのdaosがあるとすると、my_tableのクエリをmy_join_tableの列order_column_1並べ替えます

1- 2つのクエリビルダーを結合QueryBuilder.selectRaw(String... columns)し、メソッドを使用して、元のテーブルと外部ソートで使用する列を含めました。例:

QueryBuilder<MyJoinTable, MyJoinPK> myJoinQueryBuilder = myJoinDao.queryBuilder();
QueryBuilder<MyTable, MyPK> myQueryBuilder = myDao.queryBuilder().join(myJoinQueryBuilder).selectRaw("`my_table`.*", "`my_join_table`.`order_column` as `order_column_1`");

2-次のような句で私の注文を含めました:

myQueryBuilder.orderByRaw("`order_column_1` ASC");

3-すべてのselect列とorderby句を設定したら、ステートメントを準備します。

String statement = myQueryBuilder.prepare().getStatement();

4-daoからテーブル情報を取得します。TableInfotableInfo=((BaseDaoImpl)myDao).getTableInfo();

5-不明な列名を無視するカスタムの列からオブジェクトへのマッパーを作成しました。order_column_1これを行うことで、カストン列(この場合)のマッピングエラーを回避します。例:

RawRowMapper<MyTable> mapper = new UnknownColumnIgnoringGenericRowMapper<>(tableInfo);

6-結果についてテーブルをクエリします。

GenericRawResults<MyTable> results = activityDao.queryRaw(statement, mapper);

7-最後に、一般的な生の結果をリストに変換します。

List<MyTable> myObjects = new ArrayList<>();
for (MyTable myObject : results) {
    myObjects.add(myObject);
}

com.j256.ormlite.stmt.RawRowMapperImplこれは、不明な列マッピングエラーを回避するために変更(例外を飲み込んだだけ)して作成したカスタム行マッパーです。これをコピーしてプロジェクトに貼り付けることができます。

import com.j256.ormlite.dao.RawRowMapper;
import com.j256.ormlite.field.FieldType;
import com.j256.ormlite.table.TableInfo;

import java.sql.SQLException;

public class UnknownColumnIgnoringGenericRowMapper<T, ID> implements RawRowMapper<T> {

    private final TableInfo<T, ID> tableInfo;

    public UnknownColumnIgnoringGenericRowMapper(TableInfo<T, ID> tableInfo) {
        this.tableInfo = tableInfo;
    }

    public T mapRow(String[] columnNames, String[] resultColumns) throws SQLException {
        // create our object
        T rowObj = tableInfo.createObject();
        for (int i = 0; i < columnNames.length; i++) {
            // sanity check, prolly will never happen but let's be careful out there
            if (i >= resultColumns.length) {
                continue;
            }
            try {
                // run through and convert each field
                FieldType fieldType = tableInfo.getFieldTypeByColumnName(columnNames[i]);
                Object fieldObj = fieldType.convertStringToJavaField(resultColumns[i], i);
                // assign it to the row object
                fieldType.assignField(rowObj, fieldObj, false, null);
            } catch (IllegalArgumentException e) {
                // log this or do whatever you want
            }
        }
        return rowObj;
    }
}

それはかなりハッキーで、この操作にはやり過ぎのようですが、私は間違いなくそれが必要であり、この方法はうまくいきました。

于 2015-07-10T16:16:33.947 に答える