実際、クエリ全体を生のクエリとして記述せずに、なんとか実行できました。このように、クエリビルダーコードを置き換える必要はありませんでした(これはかなり複雑です)。それを達成するために、私は次の手順に従いました。
(my_tableとmy_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;
}
}
それはかなりハッキーで、この操作にはやり過ぎのようですが、私は間違いなくそれが必要であり、この方法はうまくいきました。