首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用HibernateTemplate时无法获取列名

使用HibernateTemplate时无法获取列名
EN

Stack Overflow用户
提问于 2012-05-18 18:43:51
回答 3查看 2K关注 0票数 0

我正在使用Spring-orm和HibernateTemplate来执行一个原生SQL查询(参考DB是Oracle11),如下所示:

代码语言:javascript
运行
复制
@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;
}

我已经成功地执行了查询并得到了结果。但是我找不到一种方法来获得结果列名,并且我开始认为使用这种方法是不可能的。我的问题是,我必须执行来自用户输入的查询,而我对参数名称一无所知。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-18 20:51:49

我终于找到了一种方法,所以我把它贴出来,希望它能对其他人有用。我做错了,正确的方法(至少对于我的需求而言)是使用doWork

安装:

代码语言:javascript
运行
复制
session.createSQLQuery(queryStr);

我必须像这样得到连接:

代码语言:javascript
运行
复制
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!");
        }
    }
});
票数 1
EN

Stack Overflow用户

发布于 2012-11-22 15:22:13

尝试执行以下操作以获取Hibernate中的列名:

代码语言:javascript
运行
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2012-05-18 18:52:09

您可以使用ResultTransformer类将查询结果映射到实体类。

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

编辑1:

代码语言:javascript
运行
复制
for( int i= 0; i< ((Object[])res.get(0)).length ; i++){
    //do something with data
    res.get(0)[i]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10651151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档