Пример базы данных ResultSet
fclass,geometry,scenario
""elementary_school"","MULTIPOINT(303400.907447057 9044592.97070337)",66
""elementary_school"","MULTIPOINT(302777.056751395 9044333.43169871)",66
""elementary_school"","MULTIPOINT(304182.88271353 9042435.93276122)",66
""elementary_school"","MULTIPOINT(304592.928219703 9041564.59729198)",66
""elementary_school"","MULTIPOINT(311385.417245523 9052785.71100888)",66
""worship"","MULTIPOINT(307397.04764638 9039421.31774996)",66
""worship"","MULTIPOINT(304384.660908793 9047145.34109501)",66
""worship"","MULTIPOINT(304518.616783947 9039859.48619132)",66
""worship"","MULTIPOINT(304689.11878157 9041491.61685193)",66
""worship"","MULTIPOINT(304711.539434326 9047763.53595371)",66
""worship"","MULTIPOINT(303420.353637529 9048419.36252138)",66
Класс, доступ к которому осуществляется с помощью отражения
public class Amenities {
public Integer amenities_id;
public Integer scenario;
public String fclass;
public String location;
public String buffer;
public TableInfo[] amenity_info;
}
Использование отражения
private PostStatus getAmenities(String layerUP, String layer, String[] tableUP, String[] table, String scenarioId) {
PostStatus postStatus=new PostStatus();
String values = "";
for (int i = 0; i < tableUP.length; i++) {
if (tableUP[i].equals("location")) {
//values += "st_astext("+table[i]+")";
values += "st_astext("+table[i]+") as "+table[i];
} else if (tableUP[i].equals("scenario")) {
values += scenarioId+" as scenario";
} else {
values = "property_json->'" + table[i] + "' as "+ table[i] ;
}
if (i < tableUP.length - 1) {
values += ",";
} else {
values = values.replaceAll(",$", "");
}
}
String errorMsg = "";
String query ="";
try (
Connection connection = DriverManager.getConnection(
upURL,
upUser,
upPassword)) {
Statement statement = connection.createStatement();
query="select " + values + " from user_layer\n"
+ "inner join user_layer_data on user_layer.id = user_layer_data.user_layer_id\n"
+ "where user_layer.id=" + layer;
ResultSet data = statement.executeQuery(query);
ArrayList<Amenities> data_in = new ArrayList<>();
while (data.next()) {
Object o = new Amenities();
Class<?> c = o.getClass();
for (int i = 0; i < tableUP.length; i++) {
try {
Field f = c.getDeclaredField(tableUP[i]);
f.setAccessible(true);
if (!tableUP[i].equals("scenario") || !tableUP[i].equals("amenities_id")) {
f.set(o, data.getString(table[i]));
} else if (tableUP[i].equals("scenario")) {
Integer scen=(Integer)data.getInt(tableUP[i]);
f.set(o,scen );
} else if (tableUP[i].equals("location")) {
f.set(o, data.getString(table[i]));
} else if (tableUP[i].equals("amenities_id")) {
}
} catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException | SQLException e) {
log.error(e, errorMsg);
}
}
log.debug(o, "reflection");
data_in.add((Amenities) o);
}
Tables<Amenities> final_data = new Tables<Amenities>(data_in);
RestTemplate restTemplate = new RestTemplate();
postStatus=restTemplate.postForObject("http://" + upwsHost + ":" + upwsPort + "/amenities/", final_data, PostStatus.class);
return postStatus;
} catch (SQLException ex) {
for (Throwable e : ex) {
if (e instanceof SQLException) {
e.printStackTrace(System.err);
errorMsg += "SQLState: " + ((SQLException) e).getSQLState();
errorMsg += "Error Code: " + ((SQLException) e).getErrorCode();
errorMsg += "Message: " + e.getMessage();
/*Throwable t = ex.getCause();
while (t != null) {
errorMsg += "Cause: " + t;
t = t.getCause();
}*/
}
}
log.error(ex, errorMsg+query);
}catch(Exception e){
log.error(e, errorMsg+query);
}
postStatus.status="Error";
postStatus.message=errorMsg+query;
return postStatus;
}
Мой код не работает, когда он устанавливает значение целочисленного атрибута объекта Amenites, используя код Integer scen=(Integer)data.getInt(tableUP[i]); f.set(o,scen );
, когда я проверяю результаты, другие значения назначаются правильно, но значение поляСценарий остается нулевым.
Я уверен, что значения из базы данных ResultSet существуют, также я попытался установить статическое целочисленное значение 66
, и он показывает только поле со значением 0
.
Поскольку я довольно новичок в Java, буду признателен, если вы поможете мне понять, что я делаю не так?