Hibernate Hql语句
Emp表
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr;//经理 private Date hiredate; private Double sal; private Integer comm; private Integer deptno;}
1.from子句
Hibernate中最简单的查询语句的形式如下:
from eg.Cat
该子句简单的返回eg.Cat类的所有实例。 通常我们不需要使用类的全限定名, 因为 auto-import(自动引入) 是缺省的情况。 所以我们几乎只使用如下的简单写法:
from Cat
大多数情况下, 你需要指定一个别名, 原因是你可能需要 在查询语句的其它部分引用到Cat
from Cat as cat
这个语句把别名cat指定给类Cat 的实例, 这样我们就可以在随后的查询中使用此别名了。 关键字as 是可选的,我们也可以这样写:
from Cat cat
子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接。
from Formula, Parameter
from Formula as form, Parameter as param
查询语句中别名的开头部分小写被认为是实践中的好习惯, 这样做与Java变量的命名标准保持了一致 (比如,domesticCat)。
2.查询N个字段
2.1
Hibernate hql语句 中 select * from 表名 不支持 * 的操作也就是说你若想查询多列,只能将列明一一列出来
例如 : select e.ename,e.job from Emp e
2.2
像上方1.1的方法就可以完成一张表的多条件查询,但是因为返回值的不确定性和返回值得零散性使得出现了另一种可以优化的方案:
2.2.1
在实体类中添加一个代参构造(构造方法中的参数数量由你所要查询的列数来决定:如上我就需要添加一个包含ename和job的构造)
2.2.2
修改hql语句 :select new Emp(e.ename,e.job)from Emp e
3.hql 占位符 ?,:
3.1 ?
Hibernate 中的占位和JDBC中的很像,主要用作占位
String sql="from Emp where ename=?";Query query = session.createQuery(sql);query.setParameter(0, "SMITH");
3.2 .1:普通占位
String sql="from Emp where ename=:name"; Query query = session.createQuery(sql); query.setParameter("name", "SMITH");
这种占位的:后的占位名不需要和javabean中的属性一致,但是建议一致
3.2.2:用于实体占位
String sql="from Emp where ename=:ename"; Query query = session.createQuery(sql); Emp emp=new Emp(); emp.setEname("SMITH"); query.setProperties(emp);
这种用法的好处是可以不需要重复使用query.setParameter();方法,但是前提示:后的占位必须和javabean对应
4.hql 分页
String hql="from Emp d order by d.empno"; Query query = HibernateUtil.getSession().createQuery(hql); int index=1; int size=3; query.setFetchSize((index-1)*size); query.setMaxResults(size);
注意该方法的分页是从0开始的