Создана программа, выводящая в TableView данные из SQL-запроса к Oracle (12c).
Проблема в том, что некоторые данные в TableView выводятся, некоторые - нет.
Код программы:
1. Класс Controller
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
package sample;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.sql.*;
import java.util.Formatter;
public class Controller extends Const{
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private AnchorPane podlojkaInt;
@FXML
private Button buttonClick;
@FXML
private TableColumn<DataModelSQL, String> columnOne;
@FXML
private TableColumn<DataModelSQL, String> columnTwo;
@FXML
private TableColumn<DataModelSQL, String> columnThree;
@FXML
private TableColumn<DataModelSQL, String> columnFour;
@FXML
private TableColumn<DataModelSQL, String> columnFive;
@FXML
private TableColumn<DataModelSQL, String> columnSix;
@FXML
private TableColumn<DataModelSQL, String> columnSeven;
@FXML
private TableView<DataModelSQL> tableShow;
@FXML
void initialize() {
ObservableList<DataModelSQL> list = FXCollections.observableArrayList();
tableShow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableShow.getSelectionModel().setCellSelectionEnabled(true);
buttonClick.setOnAction(event -> {
DatabBaseHandler connect = new DatabBaseHandler();
String sql = "SELECT * FROM TABLE.NAME WHERE ID_COLUMN1 = 12 AND ID_COLUMN2 = 1234";
try {
Statement statement = connect.getDbConnection().createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
String column3 = resultSet.getString(3);
System.out.println(column3);
list.add(new DataModelSQL(resultSet.getString(1),resultSet.getString(2),
resultSet.getString(3),resultSet.getString(4),
resultSet.getString(5),resultSet.getString(6),
resultSet.getString(7)));
columnOne.setCellValueFactory(new PropertyValueFactory<DataModelSQL, String>("idV"));
columnTwo.setCellValueFactory(new PropertyValueFactory<DataModelSQL, String>("idS"));
columnThree.setCellValueFactory(new PropertyValueFactory<DataModelSQL, String>("val"));
columnFour.setCellValueFactory(new PropertyValueFactory<DataModelSQL, String>("idUser"));
columnFive.setCellValueFactory(new PropertyValueFactory<DataModelSQL, String>("idVParent"));
columnSix.setCellValueFactory(new PropertyValueFactory<DataModelSQL, String>("dateAdd"));
columnSeven.setCellValueFactory(new PropertyValueFactory<DataModelSQL, String>("visible"));
tableShow.setItems(list);
}
resultSet.close();
statement.close();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
});
}
}
2. Класс DataModelSQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
package sample;
import javafx.beans.property.*;
//это класс для модели данных, получаемых из БД
public class DataModelSQL {
private SimpleStringProperty idV;
private SimpleStringProperty idS;
private SimpleStringProperty val;
private SimpleStringProperty idUser;
private SimpleStringProperty idVParent;
private SimpleStringProperty dateAdd;
private SimpleStringProperty visible;
public DataModelSQL(String idV, String idS, String val, String idUser,
String idVParent, String dateAdd, String visible)
{
this.idV = new SimpleStringProperty(idV);
this.idS = new SimpleStringProperty(idS);
this.val = new SimpleStringProperty(val);
this.idUser = new SimpleStringProperty(idUser);
this.idVParent = new SimpleStringProperty(idVParent);
this.dateAdd = new SimpleStringProperty(dateAdd);
this.visible = new SimpleStringProperty(visible);
}
public String getIdV()
{ return idV.get();}
public void setIdV(String value)
{ idV.set(value);}
public String getIdS()
{ return idSlv.get();}
public void setIdS(String value)
{ idSlv.set(value);}
public String getVal()
{ return val.get();}
public void setVal(String value)
{ val.set(value);}
public String getIdUser()
{ return idUser.get();}
public void setIdUser(String value)
{ idUser.set(value);}
public String getIdVParent()
{ return idVParent.get();}
public void setIdVParent(String value)
{ idVParent.set(value);}
public String getDateAdd()
{ return dateAdd.get();}
public void setDateAdd(String value)
{ dateAdd.set(value);}
public String getVisible()
{ return visible.get();}
public void setVisible(String value)
{ visible.set(value);}
}
TableView выводит результаты колонок: 2, 4, 6, 7, не выводит - 1, 3, 5.
Типы данных в колонках:
1 - number
2 - number
3 - varchar2(2000)
4 - number
5 - number
6 - timestamp
7 - number
По тем колонкам, в которых данные не выводятся, вылетает ошибка, пример:
Can not retrieve property 'idVParent' in PropertyValueFactory:
javafx.scene.control.cell.PropertyValueFactory@b0e3501 with provided class type: class sample.DataModelSQL
java.lang.IllegalStateException: Cannot read from unreadable property idVParent
Не совсем понятно, что имеется в виду под "не читаемым свойством".
Тем не менее, полагаю, дело в модели данных и ее работе с типами данных, так как
с помощью тестового кода:
1.
2.
String column3 = resultSet.getString(3);
System.out.println(column3);
в цикле while, удавалось в консоль вывести значение колонки №3, которую не выводит TableView.
Поэтому, в итоге вопрос: что неверно прописано в моей модели данных? Дело в типах данных, прописанных в классе-модели DataModelSQL или в неверном обращении к ней из класса Controller?
Также не откажусь от замечаний по общему написанию кода.