SQL 查询在 SQL 开发人员中有效,但在 Java 方面无效
SQL Query works in SQL Developer, but not on the Java side
我正在尝试解决这个问题,但没有成功。我正在尝试查找特定 table 中包含值的每一行。
例如,让我们考虑这个员工 table:
| Id | First_name | Last_name | Date_of_birth | Car_number |
|------------------|------------|------------|---------------|------------|
| 10001 | John | Washington | 28-Aug-43 | 5 |
| 10083 | Arvid | Sharma | 24-Nov-54 | null |
| 10034 | David | Johnson | 12-May-76 | |
我正在 Java 端构建此查询(这是我在日志中打印的内容):
Select * From Employee WHERE Id LIKE ? OR First_name LIKE ? OR Last_name LIKE ? OR Date_of_birth LIKE ? OR Car_number LIKE ?
然后我使用准备好的语句,这样,如果我搜索字符串 'oh',它将变为:
Select * From Employee WHERE Id LIKE '%oh%' OR First_name LIKE '%oh%' OR Last_name LIKE '%oh%' OR Date_of_birth LIKE '%oh%' OR Car_number LIKE '%oh%'
对应代码如下:
String wantedQuery = "Select * From " + tableName + " WHERE";
PreparedStatement preparedStatement;
try(ResultSet rsColumns = columnsForTable(tableName)) {
String keyword = keywordField.getText();
int limit = 0;
while (rsColumns.next()) {
wantedQuery += " " + rsColumns.getString(1) + " LIKE ? OR";
limit++;
}
wantedQuery = wantedQuery.substring(0, wantedQuery.length()-3);
preparedStatement = con.prepareStatement(wantedQuery);
System.out.println(wantedQuery);
System.out.println("\'%"+keyword+"%\'");
for(int i = 1; i <= limit; i++) {;
preparedStatement.setString(i, "\'%"+keyword+"%\'");
}
}
try(ResultSet rs = preparedStatement.executeQuery()) {
//now get the results from here
ResultSetMetaData metaData = rs.getMetaData();
while (rs.next()) {
System.out.println("Fetching row");
...
}
现在的问题是,当我尝试获取结果时,它给了我 0 行(我从未看到 "Fetching row" 打印出来),但查询在 SQL Developer 中有效。所以我猜错误是在 Java 方面,但我知道它可能是什么。有什么想法吗?
当您使用 setString()
时,JDBC 知道它必须是一个字符串,因此它会根据需要在 String
周围加上单引号,您不必自己做。但是因为你这样做,它实际上与你期望的不同。
试试下面提到的方法
- 在 java 代码
中的查询的开头和结尾添加空格
- 删除;从 java 代码中 sql 的末尾开始,每当 java 代码执行 sql 时,它都会附加;
我正在尝试解决这个问题,但没有成功。我正在尝试查找特定 table 中包含值的每一行。
例如,让我们考虑这个员工 table:
| Id | First_name | Last_name | Date_of_birth | Car_number |
|------------------|------------|------------|---------------|------------|
| 10001 | John | Washington | 28-Aug-43 | 5 |
| 10083 | Arvid | Sharma | 24-Nov-54 | null |
| 10034 | David | Johnson | 12-May-76 | |
我正在 Java 端构建此查询(这是我在日志中打印的内容):
Select * From Employee WHERE Id LIKE ? OR First_name LIKE ? OR Last_name LIKE ? OR Date_of_birth LIKE ? OR Car_number LIKE ?
然后我使用准备好的语句,这样,如果我搜索字符串 'oh',它将变为:
Select * From Employee WHERE Id LIKE '%oh%' OR First_name LIKE '%oh%' OR Last_name LIKE '%oh%' OR Date_of_birth LIKE '%oh%' OR Car_number LIKE '%oh%'
对应代码如下:
String wantedQuery = "Select * From " + tableName + " WHERE";
PreparedStatement preparedStatement;
try(ResultSet rsColumns = columnsForTable(tableName)) {
String keyword = keywordField.getText();
int limit = 0;
while (rsColumns.next()) {
wantedQuery += " " + rsColumns.getString(1) + " LIKE ? OR";
limit++;
}
wantedQuery = wantedQuery.substring(0, wantedQuery.length()-3);
preparedStatement = con.prepareStatement(wantedQuery);
System.out.println(wantedQuery);
System.out.println("\'%"+keyword+"%\'");
for(int i = 1; i <= limit; i++) {;
preparedStatement.setString(i, "\'%"+keyword+"%\'");
}
}
try(ResultSet rs = preparedStatement.executeQuery()) {
//now get the results from here
ResultSetMetaData metaData = rs.getMetaData();
while (rs.next()) {
System.out.println("Fetching row");
...
}
现在的问题是,当我尝试获取结果时,它给了我 0 行(我从未看到 "Fetching row" 打印出来),但查询在 SQL Developer 中有效。所以我猜错误是在 Java 方面,但我知道它可能是什么。有什么想法吗?
当您使用 setString()
时,JDBC 知道它必须是一个字符串,因此它会根据需要在 String
周围加上单引号,您不必自己做。但是因为你这样做,它实际上与你期望的不同。
试试下面提到的方法
- 在 java 代码 中的查询的开头和结尾添加空格
- 删除;从 java 代码中 sql 的末尾开始,每当 java 代码执行 sql 时,它都会附加;