hibernate HQL

来源:互联网 发布:海马玩mac版怎么安装 编辑:程序博客网 时间:2024/06/12 22:16

1、from User
在SQL中经常用到from 表名,但这里不同的是User在这里并不是表名,而是实体类的名称,由hibernate帮我们进行映射。
List users= (List)session.createQuery(“select user from User user”).list();
上述语句的作用就是查出所有的Special对象放到一个List当中。
select user.name,user.age from User where user.age > 20 and user.age < 60
这样我们就查出了年龄大于20且小于60的User的姓名和年龄。当我们查询多个属性时,返回的结果是一个Object[]数组,而只有单个时是返回Object,这个需要不同的解析方式,所以在查询时需要注意。
SQL语句中的and,or,like,<,>,=等都可以在HQL中进行使用。
模糊查询补充:
like语法简介:
% 表示任意个数的任意字符
_ 表示任意一个字符
[abcdefg] 表示里面的字符任何一个,只取一个
[^c] 表示里面的字符不包含c
[a-z] 表示区间中的任一个,如c或d等
[^a-z] 表示非区间中的任一个
escape ‘/’ 转义符,表示/之后的字符不是特殊字符。
like ‘%商品/%模板%’ escape ‘/’ 可以查出 商品%模板 特殊字符。
2、把查询到的结果放到User对象中
select new User(user.name,user.age) from User user where user.age > 20
这里调用的是User的构造函数,User类中必须存在接收两个参数的User构造函数,否则会报错。
3、动态赋值
利用字符串拼接不利于项目维护。
3.1 用顺序占位符来代替然后再设置具体值。
例1:
Query query = session.createQuery(“select new User(user.name,user.age,user.id) from User user where user.name=?”);
query.setString(0,”tom”);
例2:
List users = (List)session.createQuery(“select user from User user where name like ?”)
.setParameter(0, “%刘%”)
.list();
这种方法跟jdbc的PreparedStatement类似,都是通过set***进行设值的,值得注意的是,这里的position从0开始,而PreparedStatement从1开始。3.2 用引用占位符来代替然后再设置具体值。
Query query = session.createQuery(“select new User(user.name,user.age,user.id) from User user where user.name=:name”);
query.setParameter(“name”,”tom”);
HQL语句当中有一个:name,这就是引用占位符,我们只需要在后面通过setParameter进行设值即可,其第一个参数为HQL语句中的占位符的值。
4、 只有一个返回值
例1:
Student stu = (Student)session.createQuery(“select stu from Student stu where id = ?”)
.setParameter(0, 1)
.uniqueResult();
例2:
User user = (User)session.createQuery(“select user from User user where name = ? and password = ?”)
.setParameter(0, “tom”).setParameter(“1”, “123”)
.uniqueResult();
如果有多个值抛错。
如果有值且只有一个,返回一个object。
如果没值,返回null。
5.分页查询
List stus = (List)session.createQuery(“select stu from Student stu where stu.room.name like :room and sex like :sex”)
.setParameter(“room”, “%计算机应用%”).setParameter(“sex”, “%女%”).setFirstResult(0).setMaxResults(10)
.list();
setFirstResult():设置从哪条数据开始查询的(分页的索引是从0开始的);
setMaxResults():设置每页显示的条数。
5、组合查询
4.1 inner join
4.2 left outer join
4.3 right outer join
4.4 full join