mappatura automatica di query Raw
ho avuto problema dei campi di mappatura da personalizzati selezionare le colonne che non sono tornare presente in qualsiasi modello di tabella. Quindi ho personalizzato RawRowMapper
che può mappare i campi dalla query personalizzata al modello personalizzato. Questo è utile quando hai una query che ha campi che non corrispondono a nessun modello di mappatura delle tabelle.
Questo è RowMapper che esegue la mappatura interrogazione automatica:
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;
}
}
}
E qui viene il utilizzo:
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()
Ciò restituirà List<Model>
con righe di risultati mappati modella Se colonna di interrogazione nomi e @DatabaseField(columnName
sono gli stessi
FYI Daniel. ORMLite 4.22 è stato appena rilasciato e supporta semplici query JOIN. – Gray
In precedenza avevo ORMLite 4.23 che non supportava le query JOIN. Rivedendo le date di rilascio e il timestamp del tuo commento, credo che intendessi dire che ORMLite 4.26, rilasciato il 26/09/12, è stata la prima versione a supportare semplici query JOIN. Ho appena aggiornato alla 4.45, che ha sicuramente UNISCITI. –