【问题标题】:Using MySQL Like clause in javafx [closed]在 javafx 中使用 MySQL Like 子句 [关闭]
【发布时间】:2018-08-23 10:37:11
【问题描述】:

假设我有一张桌子

+----------------+-----------------------+---------------------+
|  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|
        +-----------------------------+    +---------+

我想要做的是,如果我在文本字段中输入“冒险和动作电影”,并且在我点击按钮后,表格视图中的结果应该是:

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);

}

为 sedrick 编辑:

String word = txt_search.getText();

String sql = "SELECT * FROM table WHERE colKeywords LIKE '%word%'";

我这样做对吗?如果文本字段中有多个单词怎么办?

【问题讨论】:

  • 哪个部分不工作?
  • hi isaace,如果我按下按钮,tableview 什么也不显示。而是在系统中显示错误。不过,我首先应该做什么..我很抱歉..你能指导我吗?我能够从数据库中填充表格视图。但是我无法使用 like 子句过滤表。对不起我的英语
  • 这样做的方法是添加一个Keyword 表和一个link 表。 Link 表将colID 映射到keywordID

标签: java mysql sql javafx sql-like


【解决方案1】:

我不确定哪个部分不工作,但下面的代码应该可以工作:

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

代码(当我尝试从该列中获取关键字时,我将 colKeywords 替换为 colTitle):

@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;

    }

【讨论】:

  • 嗨,isaace,感谢您的帮助。实施时我似乎没有工作,我担心地编辑了您的答案。非常感谢
  • 在调用 table_title.setItems() 之前需要将其转换为 ObservableList。查看我的编辑。
  • ObservableList observableList = FXCollections.observableList(results);
  • table_title.setItems(observableList);
  • 非常感谢isaace..它现在没有返回错误..我知道它正在工作,因为当我点击搜索按钮时,表格现在显示网格。但问题是它没有在表格中显示标题。它是空的。应该有设置还是应该事先对表进行设置?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多