0

I'm using Spring-orm and HibernateTemplate to execute a native SQL query (DB is Oracle 11 for the reference), like this:

@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; } 

I've managed to successfully execute the query and get the results back. But I couldn't figure out a way to also get the resulting column names, and I'm starting to think that's not possible using this approach. My problem is that I have to execute a query that comes from user input and I have no clues about parameter names.

Any ideas?

3 Answers 3

1

I finally found a way through it, so I post it hoping it'll be useful for others. I was doing it the wrong way, the correct way (at least for what my needs are) is to use doWork.

instad of:

session.createSQLQuery(queryStr); 

I had to get the connection like this:

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!"); } } }); 
Sign up to request clarification or add additional context in comments.

Comments

1

Try the following to get column names in 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; } 

Comments

0

You can use ResultTransformer class to map the query result to an entity class.

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17313

EDIT 1:

for( int i= 0; i< ((Object[])res.get(0)).length ; i++){ //do something with data res.get(0)[i] } 

3 Comments

That's not what I'm looking for, unfortunately. To use ResultTransformer you must provide a bean, which means that I know in advance how many colums will the query return, which I don't.
the fact is that res does not contain information about the columns, just the data returned by the query.
Thanks @fmucar, i finally found an answer and I posted it.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.