Search code examples
javasqlhibernatespring-orm

Can't get column name when using HibernateTemplate


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?


Solution

  • 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!");
            }
        }
    });