筛选结果集中的行



我创建了一个返回如下结果集的java方法:

String query = "SELECT * FROM "+table_name+" WHERE "+parameter+ " = " +condition;
ResultSet rs = stmt.excecuteQuery(query);
return rs;

我的理解是,ResultSet 可以像 SQL 表一样,我正在寻找一种进一步从该结果集中选择特定行的方法。

类似于另一种方法:

public ResultSet filterRS (ResultSet rs){
String query = "SELECT * FROM "+rs+" WHERE "+new_parameter+ " = " +new_condition;
ResultSet rs_new = stmt.excecuteQuery(query);
return rs_new;
}

我阅读了文档,但它没有说明如何做到这一点。有可能以简单的方式吗?

请注意:您不应该像那样处理您的查询。 您应该像这样绑定语句中的参数:

String queryString = "SELECT * FROM FOO WHER BAR = ?1 ";
Query q = em.createNativeQuery(queryString);
q.setParameter(1, conditionGoesHere);
List <Result> result = (TCiletEpsTracking) query.getResultList();

获得结果集后,有几种方法可以做到这一点。我一直采用老式的方式,遍历整个结果集,并在条目满足我的条件时将其添加到列表中。

如果你使用的是Java 8,我认为使用流对你来说可能更好。这里有一些文献: https://beginnersbook.com/2017/10/java-8-stream-filter/

不,你不能。

您需要在第一个查询中指定所有筛选条件,如下所示:

select * from my_table
WHERE column1 = x
AND column2 = y

然后,运行此 SQL 并获取所需的行。您可以拥有ANDOR的任意组合。

我想编写一个通用解决方案,允许用户提交搜索条件并让 servlet 返回某些字段与搜索条件匹配的所有行。我使用 Java 的 FilteredResultSet 来完成此操作,而不是构造一个 SELECT * FROM 表 WHERE field1 = criteria OR field2 = criteria,...等等等等。这是基本工作代码。

import java.sql.*;
import java.util.regex.*;
import javax.sql.*;
import javax.sql.rowset.*;
public class CustomFilter {
private static class SearchFilter implements Predicate {
private Pattern pattern;    // it's a regular expression
public SearchFilter(String searchRegex){
if ( searchRegex != null && !searchRegex.isEmpty() ){
pattern = Pattern.compile(searchRegex);
}
}
public boolean evaluate(RowSet rset){
boolean result = false;
try{
// test each column to see if it's a match
ResultSetMetaData rsmd = rset.getMetaData();
for ( int index = 1; index <= rsmd.getColumnCount(); index++ ){ // not a zero based array
String columnValue = rset.getString(index);
if ( columnValue != null ){ // it's possible some columns will be null
Matcher matcher = pattern.matcher(columnValue);
if ( matcher.matches() )
return true;    // only one column has to match for the row to be included
}
}           
}catch(Exception e){
e.printStackTrace(System.err);
};
return false;   // no match, no include
}
// don't omit these method stubs
public boolean evaluate(Object value, int column) throws SQLException{
throw new UnsupportedOperationException("implementation pending...");
}
public boolean evaluate(Object value, String columnName) throws SQLException{
throw new UnsupportedOperationException("implementation pending...");
} 
}
public static void main(String[] args){
Connection conn = null;
Statement  stmt = null;
ResultSet  rset = null;
try{
// register the driver
Class.forName("com.mysql.jdbc.Driver");
// get a connection
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mes", "root", "root");
// create a statement
stmt = conn.createStatement();
// get the unfiltered results
String sql = "SELECT * FROM employee";
rset = stmt.executeQuery(sql);
// create a filtered result set
FilteredRowSet frst = RowSetProvider.newFactory().createFilteredRowSet();
// populate it with the unfiltered results
frst.populate(rset);
// create and apply a filter (filters utilise regular expressons)
frst.setFilter(new SearchFilter("^August"));
// dump the results
while ( frst.next() ){
System.out.println(String.format("%s-%s", frst.getString("forename"), frst.getString("surname")));
}
}catch(Exception e){
e.printStackTrace(System.err);
}
}
}

以下是我在Raspberry Pi上编译和运行它的方式。

java-cp/usr/share/java/mysql.jar CustomFilter.java

对于阅读我上面的答案的任何人,请注意,我添加它只是为了学术完整性,以便我可以为所提出的问题提供可能的解决方案(作为 Java 问题(。

相关内容

  • 没有找到相关文章

最新更新