1. BaseDAO
    需求:
    按名字分页查询对应书籍信息

  2. 原生sql
    hql实现不了的功能,可以考虑使用原生sql
    1、多表(5+)联查
    2、未配置映射文件中关系

  3. 视图映射

    场景
    select * from 3表联查

SELECT @rowno:=@rowno + 1 AS rowno,a.* FROM tableName a,(SELECT @rowno:=0) b

原生sql:

SQLQuery sqlQ = session.createSQLQuery("select tname,tage from teacher ");
	//指定查询出来的列的名称和类别
	sqlQ.addScalar("tname", Hibernate.STRING);
	sqlQ.addScalar("tage", Hibernate.INTEGER);

//有条件的
SQLQuery sqlQ = session.createSQLQuery("select * from teacher where tname like :tname and tage > :tage");
	
	Teacher t = new Teacher();
	t.setTage(26L);
	t.setTname("%王%");
	
	sqlQ.addEntity("t",Teacher.class);
	
	sqlQ.setProperties(t);

//统计 分组
SQLQuery sqlQ=session.createSQLQuery("select s.sclass,count(*) c from students s group by s.sclass order by c desc");
	sqlQ.addScalar("sclass", Hibernate.STRING);
	sqlQ.addScalar("c", Hibernate.INTEGER);

//连接查询 (没有fetch,只有在hql中才有)

//SQLQuery sqlQ=session.createSQLQuery(“select s.,t. from students s left join tAndS ts on s.sid=ts.studentId left join teachers t on ts.teacherId=t.tid where t.tname like ?”);
//sqlQ.addEntity(“s”,Student.class);
//sqlQ.addEntity(“t”,Teacher.class);
//sqlQ.setString(0, “%李四%”);

分页
//原生sql方式 其他方式也差不多
int pageRow=2;//每页显示多少行
int currPage=2;//当前页

	SQLQuery sqlQ=session.createSQLQuery("select t.* from teachers t");
	sqlQ.addEntity("t",Teacher.class);
	sqlQ.setFirstResult((currPage-1)*pageRow);
	sqlQ.setMaxResults(pageRow);
	
	List<Teacher> ts=sqlQ.list();
	for(Teacher t : ts){
		System.out.println(t.getTname());		}

Hibernate SQLQuery 查询char类型结果为一个字符解决方法
在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得知产生这个问题的主要原因确实是Hibernate再查询Oracle的时候,将char自动映射成character(varchar的子集)类型,现有以下几种解决方法:

1:将你要查询的实体转换成实体Bean,使用HQL查询,这样就不存在字段映射的问题了,但是这样比较麻烦;

2:可以使用Hibernate中的addScalar(String arg,Type type)来自定义返回字段的类型,如:
this.getSession()
.createSQLQuery(“select id,name,state from tb”)
.addScalar(“id”, Hibernate.STRING)
.addScalar(“name”, Hibernate.STRING)
.addScalar(“state”, Hibernate.STRING)
.list();
这样就可以解决,但是这样的话,必须把所有要查询的字段进行定义,在字段比较多的时候,就相对比较麻烦;

11-08 19:41