在 javafx 中使用 MySQL Like 子句
Using MySQL Like clause in javafx
说我有一个 Table
+----------------+-----------------------+---------------------+
| colID | colTitle | colKeywords |
+----------------+-----------------------+---------------------+
| 1 | Jumanji | comedy adventure |
| 2 | Moana | adventure animation |
| 3 | Shawshank Redemption | drama tearjerker |
| 4 | Avengers | action |
+----------------+-----------------------+---------------------+
+-----------------------------+ +---------+
Search: | adventure and action movies | |button GO|
+-----------------------------+ +---------+
我想要做的是,如果我在文本字段中键入 "adventure and action movies",在我按下按钮后,tableview 中的结果应该是:
Jumanji
Moana
Avengers
我想使用 Like 子句实现此目的。到目前为止,已经尝试了很多示例并提出了问题,但似乎没有任何效果。
我在写作时使用的代码:
@FXML
private void goSearch(ActionEvent event) throws IOException, SQLException{
String sql = "SELECT * FROM table_entry WHERE colKeywords LIKE ? ";
conn = SqlConnection.ConnectDB();
pst=conn.prepareStatement(sql);
String criteria = txt_search.getText();
if (criteria.trim().length() == 0) { return; }
List<String> results = new ArrayList<>();
String[] arryCriterion = criteria.split(" ");
for (int i = 0; i < arryCriterion.length; i++) {
String criterion = "%" + arryCriterion[i] + "%";
pst.setString(1, criterion);
rs = pst.executeQuery();
while (rs.next()) {
results.add(rs.getString("colKeywords"));
}
}
table_title.setItems(results);
}
为塞德里克编辑:
String word = txt_search.getText();
String sql = "SELECT * FROM table WHERE colKeywords LIKE '%word%'";
我这样做对吗?如果文本字段中有多个单词怎么办?
我不确定哪个部分不工作,但下面的代码应该可以工作:
private void goSearch(ActionEvent event) throws IOException, SQLException{
try{
conn = SqlConnection.ConnectDB();
String criteria = txt_search.getText();
if (criteria.trim().length() == 0) { return; }
String[] arryCriterion = criteria.split(" ");
List<String> results = new ArrayList<>();
for (int i = 0; i < arryCriterion.length; i++) {
List<String> text = populateField(arryCriterion[i], conn);
results.addAll(text);
}
table_title.setItems(results);
}finally{
conn.close();
}
}
private List<String> populateField(String s, Connection conn){
List<String> myList = new ArrayList<>();
String sql = "SELECT * FROM table_entry WHERE colKeywords LIKE ? ";
pst=conn.prepareStatement(sql);
pst.setString(1, "%" + s + "%");
rs = pst.executeQuery();
while (rs.next()) {
myList.add(rs.getString("colKeywords"));
}
return myList;
}
以下由 andres 编辑:
netbeans 要求我转换 observablist 否则程序不会 运行
table_title.setItems((ObservableList) results);
关于错误,每次我按搜索按钮,错误是:
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to javafx.collections.ObservableList
代码(我用 colTitle 替换了 colKeywords,因为我试图从此列中获取关键字):
@FXML
private void goSearch(ActionEvent event) throws IOException, SQLException{
try{
conn = SqlConnection.ConnectDB();
String criteria = txt_search.getText();
if (criteria.trim().length() == 0) { return; }
String[] arryCriterion = criteria.split(" ");
List<String> results = new ArrayList<>();
for (int i = 0; i < arryCriterion.length; i++) {
List<String> text = populateField(arryCriterion[i], conn);
results.addAll(text);
}
You need to convert it to an ObservableList.
ObservableList<String> observableList = FXCollections.observableList(results);
table_title.setItems(observableList );
}finally{
conn.close();
}
}
@FXML
private List<String> populateField(String s, Connection conn) throws SQLException{
List<String> myList = new ArrayList<>();
String sql = "SELECT * FROM table_entry WHERE colTitle LIKE ? ";
pst=conn.prepareStatement(sql);
pst.setString(1, "%" + s + "%");
rs = pst.executeQuery();
while (rs.next()) {
myList.add(rs.getString("colTitle"));
}
return myList;
}
说我有一个 Table
+----------------+-----------------------+---------------------+
| colID | colTitle | colKeywords |
+----------------+-----------------------+---------------------+
| 1 | Jumanji | comedy adventure |
| 2 | Moana | adventure animation |
| 3 | Shawshank Redemption | drama tearjerker |
| 4 | Avengers | action |
+----------------+-----------------------+---------------------+
+-----------------------------+ +---------+
Search: | adventure and action movies | |button GO|
+-----------------------------+ +---------+
我想要做的是,如果我在文本字段中键入 "adventure and action movies",在我按下按钮后,tableview 中的结果应该是:
Jumanji
Moana
Avengers
我想使用 Like 子句实现此目的。到目前为止,已经尝试了很多示例并提出了问题,但似乎没有任何效果。
我在写作时使用的代码:
@FXML
private void goSearch(ActionEvent event) throws IOException, SQLException{
String sql = "SELECT * FROM table_entry WHERE colKeywords LIKE ? ";
conn = SqlConnection.ConnectDB();
pst=conn.prepareStatement(sql);
String criteria = txt_search.getText();
if (criteria.trim().length() == 0) { return; }
List<String> results = new ArrayList<>();
String[] arryCriterion = criteria.split(" ");
for (int i = 0; i < arryCriterion.length; i++) {
String criterion = "%" + arryCriterion[i] + "%";
pst.setString(1, criterion);
rs = pst.executeQuery();
while (rs.next()) {
results.add(rs.getString("colKeywords"));
}
}
table_title.setItems(results);
}
为塞德里克编辑:
String word = txt_search.getText();
String sql = "SELECT * FROM table WHERE colKeywords LIKE '%word%'";
我这样做对吗?如果文本字段中有多个单词怎么办?
我不确定哪个部分不工作,但下面的代码应该可以工作:
private void goSearch(ActionEvent event) throws IOException, SQLException{
try{
conn = SqlConnection.ConnectDB();
String criteria = txt_search.getText();
if (criteria.trim().length() == 0) { return; }
String[] arryCriterion = criteria.split(" ");
List<String> results = new ArrayList<>();
for (int i = 0; i < arryCriterion.length; i++) {
List<String> text = populateField(arryCriterion[i], conn);
results.addAll(text);
}
table_title.setItems(results);
}finally{
conn.close();
}
}
private List<String> populateField(String s, Connection conn){
List<String> myList = new ArrayList<>();
String sql = "SELECT * FROM table_entry WHERE colKeywords LIKE ? ";
pst=conn.prepareStatement(sql);
pst.setString(1, "%" + s + "%");
rs = pst.executeQuery();
while (rs.next()) {
myList.add(rs.getString("colKeywords"));
}
return myList;
}
以下由 andres 编辑:
netbeans 要求我转换 observablist 否则程序不会 运行
table_title.setItems((ObservableList) results);
关于错误,每次我按搜索按钮,错误是:
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to javafx.collections.ObservableList
代码(我用 colTitle 替换了 colKeywords,因为我试图从此列中获取关键字):
@FXML
private void goSearch(ActionEvent event) throws IOException, SQLException{
try{
conn = SqlConnection.ConnectDB();
String criteria = txt_search.getText();
if (criteria.trim().length() == 0) { return; }
String[] arryCriterion = criteria.split(" ");
List<String> results = new ArrayList<>();
for (int i = 0; i < arryCriterion.length; i++) {
List<String> text = populateField(arryCriterion[i], conn);
results.addAll(text);
}
You need to convert it to an ObservableList.
ObservableList<String> observableList = FXCollections.observableList(results);
table_title.setItems(observableList );
}finally{
conn.close();
}
}
@FXML
private List<String> populateField(String s, Connection conn) throws SQLException{
List<String> myList = new ArrayList<>();
String sql = "SELECT * FROM table_entry WHERE colTitle LIKE ? ";
pst=conn.prepareStatement(sql);
pst.setString(1, "%" + s + "%");
rs = pst.executeQuery();
while (rs.next()) {
myList.add(rs.getString("colTitle"));
}
return myList;
}