Raw Abfrage Auto-Mapping
Ich hatte Problem der Mapping-Felder von benutzerdefinierten auswählen, welche Spalten zurückgeben, die nicht in jedem Tabellenmodell vorhanden. So machte ich benutzerdefinierte RawRowMapper
, die Felder von benutzerdefinierten Abfrage zu benutzerdefinierten Modell zuordnen können. Dies ist nützlich, wenn Sie eine Abfrage mit Feldern haben, die keinem Tabellenmapping-Modell entsprechen.
Dies ist RowMapper die Abfrage Auto-Mapping ausführt:
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;
}
}
}
Und hier ist die Nutzung:
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()
Dies wird zurückkehren List<Model>
mit kartiert Ergebniszeilen, wenn Abfragespalte zu Modell Namen und @DatabaseField(columnName
sind die gleichen
FYI Daniel. ORMLite 4.22 wurde gerade veröffentlicht und unterstützt einfache JOIN-Abfragen. – Gray
Ich hatte zuvor ORMLite 4.23, die JOIN-Abfragen nicht unterstützt. Ich glaube, Sie wollten die Veröffentlichungsdaten und den Zeitstempel Ihres Kommentars Revue passieren lassen. ORMLite 4.26, veröffentlicht am 26.09.12, war die erste Version, die einfache JOIN-Abfragen unterstützte. Ich habe gerade auf 4.45 aktualisiert, was definitiv JOIN ist. –