用Hibernate,在数据库表设计的时候不设计表之间外键关系,所以在hbm文件里也不存在one-to-many之类的配置信息,现在要进行多表查询,比如student表和course表,进行查询:select student.sno,course.coursename from sutdent,course where student.courseid=course.id;使用List接受返回类型。我现在需要开发webservice,故在List后要加泛型(List ),否则无法发布。请问这个泛型应该是什么?是不是需要一个student类和course类的中间类?这个中间类是否可以动态生成?(需要查的时候动态创建,查询完毕后动态销毁)。
[b]问题补充:[/b]
请问xiaoyu966,能否加一些注释?我是个初学者,不太能看懂。谢谢了!
Hibernate多表查询的问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
6条回答 默认 最新
- iteye_17762 2009-06-02 11:56关注
我把整个BaseDaoImpl 发上来了,JdbcTemplate jt;是用spring的set注入方式注入的,你也不用改什么东西了。
Spring配置文件中,加入以下代码<bean id="jdbcTemplete" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg ref="dataSource"></constructor-arg> </bean>
下面的代码中,动态Bean部分的注释我没有加,你自己去网上搜索一下,有很多解释的
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;import org.apache.commons.beanutils.BasicDynaClass;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.Session;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.global.dao.BaseDao;
import com.global.db.HibernateSessionFactory;public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao {
private JdbcTemplate jt; public JdbcTemplate getJt() { return jt; } public void setJt(JdbcTemplate jt) { this.jt = jt; } public void delete(Object o) { super.getHibernateTemplate().delete(o); } public Object get(Class cls, Serializable id) { return super.getHibernateTemplate().get(cls, id); } public List list(String hql) { return super.getHibernateTemplate().find(hql); } public void save(Object o) { super.getHibernateTemplate().save(o); } public void update(Object o) { super.getHibernateTemplate().update(o); }
//JdbcTemplate
public List listArraryByJdbc(String sql, Object[] objs) {
List list = jt.queryForList(sql, objs);
return list;
}public List listByJdbc(String sql) { List list = jt.queryForList(sql); return list; } public int getInt(String sql) { int count =jt.queryForInt(sql); return count; } public int getInt(String sql, Object[] objs) { int count =jt.queryForInt(sql,objs); return count; } /*用来执行用户自定义select语句,一般用于多表查询时,查询的字段为动态 * 要用到动态Bean * * */ public List listForJdbcCustom(String sql){ Connection con = null; Statement stm = null; ResultSet rs = null; //结果集元数据,即select * from... 指的是*中的的字段 ResultSetMetaData rsmd = null; List list = new ArrayList(); int columns = 0; try { //获取Connection con = jt.getDataSource().getConnection(); if (con == null) return null; //获取statement stm = con.createStatement(); if (stm == null) return null; //执行查询语句 rs = stm.executeQuery(sql); if (rs == null) return null; //通过结果集,初始化结果集元数据集合 rsmd = rs.getMetaData(); //获取列数,即select * from... 指的是*中的的字段数目 columns = rsmd.getColumnCount(); } catch (SQLException e1) { e1.printStackTrace(); } //初始化一个动态属性数组 DynaProperty[] px = new DynaProperty[columns]; String prop[] = new String[columns]; for (int i = 0; i < columns; i++) { try { prop[i] = rsmd.getColumnLabel(i + 1); } catch (SQLException e1) { e1.printStackTrace(); } try { px[i] = new DynaProperty(prop[i], Class .forName("java.lang.String")); } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } } //之后的就是关于动态Bean的知识了,你可以去网上搜索DynaBean或者DynaClass去学习一下相关知识 DynaClass dynaClass = null; DynaBean dynaBean; try { while (rs.next()) { dynaClass = new BasicDynaClass("dynaBean", null, px); try { dynaBean = dynaClass.newInstance(); } catch (IllegalAccessException e) { e.printStackTrace(); return null; } catch (InstantiationException e) { e.printStackTrace(); return null; } for (int i = 1; i <= columns; i++) { Object temp = rs.getObject(i); if (temp == null) temp = ""; else temp = rs.getObject(i).toString(); try { PropertyUtils.setProperty(dynaBean, prop[i - 1], temp); // test //System.out.println("prop = " + prop[i - 1]); // test //System.out.println("value = " + temp); } catch (IllegalAccessException e) { e.printStackTrace(); return null; } catch (InvocationTargetException e) { e.printStackTrace(); return null; } catch (NoSuchMethodException e) { e.printStackTrace(); return null; } } list.add(dynaBean); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (con != null) con.close(); if (stm != null) stm.close(); if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } } return list; }
}
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 我想在一个软件里添加一个优惠弹窗,应该怎么写代码
- ¥15 fluent的在模拟压强时使用希望得到一些建议
- ¥15 STM32驱动继电器
- ¥15 Windows server update services
- ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
- ¥15 模糊pid与pid仿真结果几乎一样
- ¥15 java的GUI的运用
- ¥15 Web.config连不上数据库
- ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
- ¥15 怎么配置广告联盟瀑布流