问题描述
我在 Java 应用程序中使用 Ormlite,以便处理 Postgresql 数据库。 我想获取一张DataBase表使用的磁盘空间。 Ormlite好像没有具体的获取方法,所以我试了一下,没有成功:
final String TABLE_NAME = "a_table_name_of_db";
//1)
String sql = "SELECT pg_relation_size('" + TABLE_NAME + "');" ;
int result = OGGETTO_DAO.executeraw(sql);
//2)
String sql = "SELECT pg_table_size('" + TABLE_NAME + "');" ;
int result = OGGETTO_DAO.executeraw(sql);
//3 - it was just a try...)
sql = "SELECT pg_table_size('" + TABLE_NAME + "');" ;
GenericRawResults<String> ARRAY = OGGETTO_DAO.queryRaw(sql);
String result= ARRAY.getFirstResult();
对于 1) 和 2) 我总是得到 -1,对于 3) 我得到一个强制转换异常;
我通过命令行(linux - 通过 psql 提示符)使用命令“pg_relation_size”或“pg_table_size”,它工作正常。
我怎么了? 谢谢
更新 - 工作解决方案:
现在可以了!根据下面接受的答案,解决方案是:
final String TABLE_NAME = "a_table_name_of_db";
String sql = "SELECT pg_table_size('" + TABLE_NAME + "');"
final long RESULT = OGGETTO_DAO.queryRawValue(sql); //in bytes
解决方法
int result = OGGETTO_DAO.executeRaw(SQL);
是的,这不对。查看 javadocs for executeRaw(...) 他们说它返回影响的行数不是结果。
SQL = "SELECT pg_table_size('" + TABLE_NAME + "');" ; GenericRawResults ARRAY = OGGETTO_DAO.queryRaw(SQL); 字符串结果= ARRAY.getFirstResult();
查看 javadocs for queryRaw(...)
,这里的问题是它返回的是 GenericRawResults<String[]>
而不是 <String>
。它返回原始结果的集合,每一行都由一个字符串数组表示。我真的很惊讶你的代码甚至可以编译。
应该是:
GenericRawResults<String[]> ARRAY = OGGETTO_DAO.queryRaw(SQL);
String result= ARRAY.getFirstResult()[0];
可能最好的方法是使用 queryRawValue(...)
执行原始查询并返回单个值。
// throws an exception if there are no results or if the first one isn't a number
long size = OGGETTO_DAO.queryRawValue(SQL);