FilteredRowSet未显示结果

时间:2015-03-28 14:34:22

标签: java oracle jdbc

我正在使用FilteredRowSet编写示例,我正在尝试运行查询,然后使用Predicate对象过滤结果。

这是我的代码:

import javax.sql.rowset.FilteredRowSet;
import oracle.jdbc.rowset.OracleFilteredRowSet;

public class Example {
    public static void main(String[] args) throws SQLException,
            IOException {
        try (FilteredRowSet rs = new OracleFilteredRowSet();) {
            rs.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
            rs.setUsername("dbuser");
            rs.setPassword("dbpassword");

            rs.setCommand("select * from employees");
            rs.execute();

            String name[] = {"user1", "user2"};
            rs.setFilter(new UserFilter("lastname", name));


            while(rs.next()){
                String lname= rs.getString("lastName");
                System.out.println(lname);
            }
        }
    }
}

这是我的Predicate类:

import javax.sql.RowSet; import javax.sql.rowset.Predicate;

public class UserFilter implements Predicate {

    private String[] names;
    private String colName = null;

    public UserFilter(String colName, String[] names) {
        this.names = names;
        this.colName = colName;
    }

    @Override
    public boolean evaluate(RowSet arg0) {
        return false;
    }

    @Override
    public boolean evaluate(Object arg0, int arg1) throws SQLException {
        return false;
    }

    @Override
    public boolean evaluate(Object valueArg, String colNameArg) throws SQLException {
        if (colNameArg.equalsIgnoreCase(this.colName)) {
            for (int i = 0; i < this.names.length; i++) {
                if (this.names[i].equalsIgnoreCase((String) valueArg)) {
                    return true;
                }
            }
        }
        return false;
    }

}

在我的数据库表employees中,我的lastName值为user1user2,但是当我按照我的问题所示应用过滤器时,我没有得到任何输出。我的意思是代码没有进入while循环。

您能告诉我如何应用滤镜吗?我希望输出包含lastName包含user1user2

的记录

1 个答案:

答案 0 :(得分:0)

你必须实现

的逻辑
public boolean evaluate(RowSet arg0);

作为最佳做法,您的过滤器应实施3 evaluate()方法。

为了避免这三种方法中的代码冗余,您可以创建一个私有帮助器方法,该方法包含将col / row值与过滤器中的值进行比较的实际逻辑,并具有3 evaluate()个方法叫它。例如,at this filter看起来不会使代码逻辑分解。