我正在使用Spring-orm和HibernateTemplate来执行一个原生SQL查询(参考DB是Oracle11),如下所示:
@Override
public List<Object> executeNativeQuery(final String queryStr, final Map<String, String> params) {
List<Object> results = this.template.execute(new HibernateCallback<List<Object>>() {
@Override
public List<Object> doInHibernate(Session session) throws HibernateException, SQLException {
// Get the query
Query query = session.createSQLQuery(queryStr);
// Assign parameters to the query, if any
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
query.setString(entry.getKey(), entry.getValue());
}
}
// fire the query
@SuppressWarnings("unchecked")
List<Object> res = query.list();
return res;
}
});
return results;
}我已经成功地执行了查询并得到了结果。但是我找不到一种方法来获得结果列名,并且我开始认为使用这种方法是不可能的。我的问题是,我必须执行来自用户输入的查询,而我对参数名称一无所知。
有什么想法吗?
发布于 2012-05-18 20:51:49
我终于找到了一种方法,所以我把它贴出来,希望它能对其他人有用。我做错了,正确的方法(至少对于我的需求而言)是使用doWork。
安装:
session.createSQLQuery(queryStr);我必须像这样得到连接:
session.doWork(new Work() {
@Override
public void execute(Connection con) throws SQLException {
try {
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(queryStr);
ResultSetMetaData md = rs.getMetaData();
int col = md.getColumnCount();
System.out.println("Number of Column : " + col);
System.out.println("Columns Name: ");
for (int i = 1; i <= col; i++) {
String col_name = md.getColumnName(i);
System.out.println(col_name);
}
} catch (SQLException s) {
System.out.println("SQL statement is not executed!");
}
}
});发布于 2012-11-22 15:22:13
尝试执行以下操作以获取Hibernate中的列名:
public ArrayList<String> getTableDesc(String tableName){
System.out.println("getFieldNames:start"+tableName);
Object[] a;
List<Object[]> fieldNames = new ArrayList<Object[]>();
ArrayList<String> tabFieldNames = new ArrayList<String>();
Session session = getHibernateTemplate().getSessionFactory().openSession();
try{
String queryStr = "desc "+tableName;
fieldNames = (List<Object[]>) session.createSQLQuery(queryStr).list();
for(int i=0;i<fieldNames.size();i++){
a = fieldNames.get(i);
tabFieldNames.add(a[0].toString());
}
}
catch(Exception e){
System.out.println("exception "+e);
}
finally{
session.close();
}
System.out.println("getFieldNames:end"+tabFieldNames.toString());
return tabFieldNames;
}发布于 2012-05-18 18:52:09
您可以使用ResultTransformer类将查询结果映射到实体类。
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17313
编辑1:
for( int i= 0; i< ((Object[])res.get(0)).length ; i++){
//do something with data
res.get(0)[i]
}https://stackoverflow.com/questions/10651151
复制相似问题