:ドキュメントには、あなたのオブジェクトにString[]
をマッピングする方法を示し、次のサンプルコードを持っていますどのテーブルモデルにも存在します。そこで私は、カスタムクエリからフィールドをカスタムモデルにマップできるカスタムRawRowMapper
を作成しました。これは、テーブルマッピングモデルに対応しないフィールドを持つクエリがある場合に便利です。
これは、クエリの自動マッピングを行いRowMapperのです:
public class GenericRowMapper<T> implements RawRowMapper<T> {
private Class<T> entityClass;
private Set<Field> fields = new HashSet<>();
private Map<String, Field> colNameFieldMap = new HashMap<>();
public GenericRowMapper(Class<T> entityClass) {
this.dbType = dbType;
this.entityClass = entityClass;
Class cl = entityClass;
do {
for (Field field : cl.getDeclaredFields()) {
if (field.isAnnotationPresent(DatabaseField.class)) {
DatabaseField an = field.getAnnotation(DatabaseField.class);
fields.add(field);
colNameFieldMap.put(an.columnName(), field);
}
}
cl = cl.getSuperclass();
} while (cl != Object.class);
}
@Override
public T mapRow(String[] columnNames, String[] resultColumns) throws SQLException {
try {
T entity = entityClass.newInstance();
for (int i = 0; i < columnNames.length; i++) {
Field f = colNameFieldMap.get(columnNames[i]);
boolean accessible = f.isAccessible();
f.setAccessible(true);
f.set(entity, stringToJavaObject(f.getType(), resultColumns[i]));
f.setAccessible(accessible);
}
return entity;
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public Object stringToJavaObject(Class cl, String result) {
if (result == null){
return null;
}else if (cl == Integer.class || int.class == cl) {
return Integer.parseInt(result);
} else if (cl == Float.class || float.class == cl) {
return Float.parseFloat(result);
} else if (cl == Double.class || double.class == cl) {
return Double.parseDouble(result);
} else if (cl == Boolean.class || cl == boolean.class) {
try{
return Integer.valueOf(result) > 0;
}catch (NumberFormatException e){
return Boolean.parseBoolean(result);
}
} else if (cl == Date.class) {
DateLongType lType = DateLongType.getSingleton();
DateStringType sType = DateStringType.getSingleton();
try {
return lType.resultStringToJava(null, result, -1);
} catch (NumberFormatException e) {
try {
return sType.resultStringToJava(null, result, -1);
} catch (SQLException e2) {
throw new RuntimeException(e);
}
}
} else {
return result;
}
}
}
そしてここでは、使い方です:
class Model{
@DatabaseField(columnName = "account_id")
String accId;
@DatabaseField(columnName = "amount")
int amount;
}
String sql = "select account_id,sum(amount) amount from orders group by account_id"
return queryRaw(sql,new GenericRowMapper<>(Model.class)).getResults()
これがあれば、クエリの列をモデル化するためにマッピングされた結果行でList<Model>
を返します。名前と@DatabaseField(columnName
はFYI
同じですダニエル。単純なJOIN問合せをサポートするORMLite 4.22がリリースされました。 – Gray
以前はJOINクエリをサポートしていないORMLite 4.23がありました。あなたのコメントのリリース日とタイムスタンプを確認すると、単純なJOINクエリーをサポートする最初のバージョンはORMLite 4.26(9/26/12)です。私はちょうどJOINがある4.45に更新しました。 –