java - my 给出一个空结果集。我的 JTable 是空的。不应该是这样

标签 java jdbc vector jtable defaulttablemodel

问题似乎出在 setInt 和 setString 方法中的“通用”语法。 - 当然,也可能是其他问题,但让我告诉你我发现了什么。

下面是我尝试使用 java 查询的 mySql 中的表。

Id   | CashFlowSensitive | Sp1
-----------------------------------
  37 |                 1 | Hello
1000 |                 0 | Hello
1401 |                 0 | number3
1500 |                 0 | number4
1504 |                 1 | Hello

如果我的代码类似于“给我所有 CashFlowSensitive=1 且 Sp1 =“Hello”的行,那么我的代码就可以工作。它给了我第一行和最后一行,因为它们完全符合过滤条件。

现在,假设我更改了表中的最后一行,将 Hello 条目替换为 number5。表格看起来像这样

Id   | CashFlowSensitive | Sp1
-----------------------------------
  37 |                 1 | Hello
1000 |                 0 | Hello
1401 |                 0 | number3
1500 |                 0 | number4
1504 |                 1 | number5

最后,我启动查询,要求它提供“CashFlowSensitive”= 1 的所有行。 我应该得到37和1504。 遗憾的是,这给出了一个空的结果集。我的 JTable 是空的。 在这个失败的例子中,我这样做:

public void searchStringTest( DefaultTableModel model, Database db, int CashFlowSensitive, String Sp1 )
{
    int first = -77;
    String second = "-55"; 

    String queryTest = " select * from helm.activitiesextended where CashFlowSensitive = ? and Sp1 = ?  ";

    try 
    {
        java.sql.PreparedStatement selectStmt = CON.prepareStatement( queryTest );

        if ( first == -77 ) {
            ((PreparedStatement) selectStmt).setInt(1, 1 );
        } else {
            ((PreparedStatement) selectStmt).setInt(1, '%' + CashFlowSensitive + '%' );    
        }

        if ( second == "-77" ) {
            ((PreparedStatement) selectStmt).setString(2, "Hello");
        } else {
            ((PreparedStatement) selectStmt).setString(2,  "%" + Sp1 + "%" );
        }            

        ResultSet rsTest = selectStmt.executeQuery();

        model.setRowCount(0);         

        while ( rsTest.next())            
        {
            Vector <Object> vector = new Vector<Object>();
            for ( int columnIndex = 1; columnIndex <=4;  columnIndex ++ )
            {
                vector.add( rsTest.getObject ( columnIndex ) );// pick next column
            }
            data.add(vector);

            model.addRow(vector);
        }

我有一个 searchString 声明为 (int CFS、int ToBeMonitored、String Sp1、String Sp2、String Sp3 和另外 7 个参数) 我将查询字符串定义为: 从表中选择 *,其中 CFS = ?和 ToBeMonitored = ?且 Sp1 = ?且 Sp2 = ?且 Sp3 = ?等等枚举十个参数。 现在,在该查询的任何给定运行中,我仅激活最多 4 个参数,例如说我想过滤掉 2 个参数:CFS 和 Sp1,其余参数对过滤过程应该是中性的,我称之为“中性”。 这样做我设置了准备好的语句 ((PreparedStatement)selectStmt).setInt(1, 1);//过滤这一项 ((PreparedStatement)selectStmt).setInt(2, '%' + ToBeMonitored + '%');//接受任何值 ((PreparedStatement)selectStmt).setString(3, "Hello");//对此进行过滤 ((PreparedStatement)selectStmt).setString(4, "%"+ Sp2 + "%"); ((PreparedStatement)selectStmt).setString(5, "%"+ Sp3 + "%"); 正如您所看到的,我强制我的 sql 遵循参数 1 和 3,同时忽略其他参数,使它们在过滤过程中保持中立。问题:尽管数据有效,但未创建结果集。

你的回答有点偏离我提出的问题。我希望您尊重这样一个事实:无论我想在每次单独运行时过滤哪些参数,都将一遍又一遍地保留相同的查询字符串。例如,如果我仅“打开”CashFlowSensitive 标志,那么在运行查询时该特定参数应该是 Activity 参数。其他参数对于过滤过程应该以中性方式表现。在其他时候,我可能会选择激活 Sp1 字段(一个 CHAR 字段),然后其他字段应该处于 hibernate 状态。在其他情况下,我可能会选择几个字段的组合,这些字段应该是 Activity 的,而未选择的字段应该是中性的。 让我缩小你的任务范围。 1) 告诉我如何使用绑定(bind)参数查询 CHAR 字段,其中该字段在过滤过程中应该是中性的,换句话说,应该接受任何内容 2) 您还能告诉我如何检查软件生成的查询字符串吗

最佳答案

问题是在 else 路径中传入第二个参数的值。您的最终查询将如下所示:

select * from helm.activitiesextended
where CashFlowSensitive = 1 and Sp1 = '%<value of Sp1>%'

这显然没有返回任何记录。如果您只需要第一个参数,则应该只查询第一个参数。像这样的东西:

select * from helm.activitiesextended where CashFlowSensitive = 1

关于java - my 给出一个空结果集。我的 JTable 是空的。不应该是这样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16826036/

相关文章:

java - 在 POM 中为 Maven 指定路径

java - 为什么使用 truncate 和 BigDecimal 会出现这种奇怪的输出?

java - 将 JDBC 驱动程序连接到 MSSQL 数据库时出现问题

java - 在 HSQLDB 中将图像添加为 BLOB 但类似 ":hsqll:jdbc:client@f3t5h"的内容最终出现在表中

c++ - 排序多维 vector

java - Jenkins 将自己的日志记录添加到 Maven 构建过程中

java - 我可以从 NetBeans 中的 Java 包调用 .mp3 或 .wav 文件吗?

jdbc - MyBatis select 语句返回空值

c++ - 为什么在 "For"和 "While"之间得到不同的结果?

c++ - 检查二维 vector 中是否存在元素