BaseDAO
需求:
按名字分页查询对应书籍信息原生sql
hql实现不了的功能,可以考虑使用原生sql
1、多表(5+)联查
2、未配置映射文件中关系视图映射
场景
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();
这样就可以解决,但是这样的话,必须把所有要查询的字段进行定义,在字段比较多的时候,就相对比较麻烦;