问题似乎与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。
可悲的是,这给出了一个空的resultSet。我的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,字符串Sp1,字符串Sp2,字符串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标志,则在运行查询时,该特定参数应为活动参数。其他参数应在过滤过程中保持中立。在其他时候,我可能选择激活Sp1字段(CHAR字段),然后其他字段应处于休眠状态。还是在其他情况下,我可能会选择多个字段的组合,这些字段应处于活动状态,而未选择的字段应保持中立。
让我来缩小您的工作范围。 1)告诉我如何使用绑定参数查询CHAR字段,该字段在过滤过程中应为中性,换句话说,应接受任何内容2)您还可以告诉我如何检查软件生成的查询字符串吗?

最佳答案

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

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


这显然不返回任何记录。如果只需要第一个参数,则应仅查询该参数。就像是:

select * from helm.activitiesextended where CashFlowSensitive = 1

09-07 11:02