论坛首页 Java版 Hibernate

hibernate SQLQuery,怎么获得metadata?

浏览 554 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-03-25
自己写了个原生sql的dao,主要目的:
1.session让spring管理
2.便利复杂查询、数据库链的存在

但是view层用extjs,需要传回的json要包含metadata(字段信息),
代码里用来sqlquery接口,但是这个接口好像并未实现metadata的获取?

各位 是怎么获得的?
难道 只能将 SQLQuery query = session.createSQLQuery(s); 改成另外一个实现方式:
session.connection().createStatement?




SQLQuery接口并未实现metadata的获得
/**
 * 
 */
package org.ggism.hibernate.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * 原生SQL DAO
 * @author GGISM's
 *
 */
public class DAO extends HibernateDaoSupport{
    public List select(String sql) {
    	return (List)execute(sql);
    }
    public String selectJson(String sql) {
    	return (String)execute(sql);
    }    
    public void insert(String sql) {
    	execute(sql);
    }
    public void update(String sql) {
    	execute(sql);
    }    
    public void delete(String sql) {
    	execute(sql);
    }    
    public Object execute(String sql) {
    	final String s = sql;
    	return (Object)getHibernateTemplate().execute(new HibernateCallback() {
    		public Object doInHibernate(Session session) throws HibernateException, SQLException {
    			SQLQuery query = session.createSQLQuery(s);
    			if (s.trim().toLowerCase().substring(0,7).contains("select")) {
    				return query.list();
                     else return null;
         });    		
    }
    private String[] getMetaData(String sql) {
    	String[] source = sql.toLowerCase().split("from")[0].
    		split("select")[1].split(",");
    	String[] dest = new String[source.length];
		for (int i = 0; i < source.length; i++ ) {
			String[] tmp = source[i].trim().split("\\.")[source[i].trim().split("\\.").length-1].split(" ");
			dest[i] = tmp[tmp.length-1];
		} 
		return dest;	
    }
    

}
   
时间:2008-03-25
我这里主要是为了整合hibernate跟spring的时候使用原生sql。

原生sql比如:
		final String sql = 
			"select * from (" +
			"select "+
/*0*/		"row_number() over(partition by op_id,busi_scene,grand_module_id order by grand_module_name,parent_module_name,module_name)-1 grand_rs,"+
/*1*/		"row_number() over(partition by op_id,busi_scene,grand_module_id,parent_module_id order by parent_module_name,module_name)-1 parent_rs,"+
/*2*/		"row_number() over(partition by op_id,busi_scene,grand_module_id,parent_module_id,module_id order by module_name)-1 child_rs,"+
/*3*/		"dense_rank() over(partition by op_id,busi_scene order by grand_module_name,grand_module_id)-1 dense_grand_rs,"+
/*4*/		"dense_rank() over(partition by op_id,busi_scene,grand_module_id order by parent_module_name,parent_module_id)-1 dense_parent_rs,"+
/*5*/		"a.grand_module_id,"+
/*6*/		"a.grand_module_name,"+
/*7*/		"a.parent_module_id,"+
/*8*/		"a.parent_module_name,"+
/*9*/		"a.module_id,"+
/*10*/		"a.module_name,"+
/*11*/		"a.busi_scene,"+
/*12*/		"a.busi_type,"+
/*13*/		"a.module_url,"+
/*14*/		"a.module_type "+
			"from sys_menu_detail a "+
			"where login_name='"+loginName+"') "+
			"order by busi_scene,grand_module_name,grand_rs,parent_module_name,parent_rs,module_name,child_rs"; 


在执行query的时候,怎么同时得到这个语句select的各个字段信息,因为使用了select * 和内联视图等。
而不是单纯得到数据库中某张表的字段信息。

不知道有没表达明白。
   
0 请登录后投票
时间:2008-05-07
不知道这个方法是不是能满足你的要求.

可以自己写一个记录这些表字段元信息的Annotation,然后在定义的POJO的各个属性上加上这个Annotation.在生成JSON数据时,用反射获得各属性的Annotation信息,分别从这些Annotation定义中得到数据表字段的元数据.
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐