【发布时间】:2017-09-29 15:46:16
【问题描述】:
我尝试在我的战争中访问 SQLLite 数据库,其中某些列的名称中有空格。
我在 SO 上看到了上一个问题 Read data from SQLite where column name contains spaces,但解决方案不起作用:
我知道我应该使用 ``、"" 或 [] 来转义列名,但这些都不适合我,每个转义字符都会出现以下异常,有空格或没有空格在列名中:
java.sql.SQLException: no such column: '[class of worker]'
java.sql.SQLException: no such column: '"age"'
与 ` 相同,在 SO 上不能很好地转义
同时,该请求适用于没有空格的未转义列名称(例如“年龄”或“教育”)
并且我的代码中的请求看起来格式正确:
SELECT DISTINCT `class of worker`, COUNT(*) as countt, ROUND(CAST(SUM(age) AS FLOAT)/COUNT(*),3) as avgage FROM census_learn_sql GROUP BY `class of worker` ORDER BY countt DESC
这是访问数据库的代码:
public Results getColumnValues(String column){
column = "`" + column + "`"; //handle space in column names
String sql = "SELECT DISTINCT "+column+", COUNT(*) as countt, ROUND(CAST(SUM(age) AS FLOAT)/COUNT(*),3) as avgage FROM census_learn_sql GROUP BY "
+column+" ORDER BY countt DESC";
Results results = new Results();
int count = 0;
int clippedOutRows = 0;
try (Connection conn = this.connect();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)){
while (rs.next()) {
if (count >= 100){
clippedOutRows += rs.getInt("countt");
}
else {
results.getResults().add(new RowResult(rs.getString(column),
rs.getInt("countt"),
rs.getDouble("avgage")));
}
count++;
}
results.setClippedOutRows(clippedOutRows);
results.setClippedOutValues(count > 99 ? count - 99 : 0);
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return results;
}
这是我的 pom 文件依赖项:
<properties>
<!-- maven-compiler-plugin -->
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<version.javaee>7.0</version.javaee>
<version.resteasy>3.0.10.Final</version.resteasy>
<version.jackson>2.4.1</version.jackson>
<version.junit>4.11</version.junit>
<version.assertj>1.6.1</version.assertj>
<version.commons>3.2.1</version.commons>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${version.resteasy}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${version.resteasy}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>${version.resteasy}</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>${version.javaee}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${version.commons}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${version.junit}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${version.assertj}</version>
<scope>test</scope>
</dependency>
<!-- SQLite JDBC library -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.8.11.2</version>
</dependency>
</dependencies>
我没有看到我在这里做错了什么,是依赖问题吗?
提前感谢您的帮助
【问题讨论】: