我创建了一个返回如下结果集的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 并获取所需的行。您可以拥有AND
和OR
的任意组合。
我想编写一个通用解决方案,允许用户提交搜索条件并让 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 问题(。