浏览 531 次
|
精华帖 (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;
}
}
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间: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 * 和内联视图等。 而不是单纯得到数据库中某张表的字段信息。 不知道有没表达明白。 |
|
| 返回顶楼 | |
|
时间:2008-05-07
不知道这个方法是不是能满足你的要求.
可以自己写一个记录这些表字段元信息的Annotation,然后在定义的POJO的各个属性上加上这个Annotation.在生成JSON数据时,用反射获得各属性的Annotation信息,分别从这些Annotation定义中得到数据表字段的元数据. |
|
| 返回顶楼 | |


