HQL语句关注的是类, 使用HQL所有字段都来自属性,而不是表里的字段
Sql是面向表的, Hql是面向对象的
一, 实体查询:
1: 以下查询所有的PersonString hql = "from Person";
2: 以下查询名称为Jack的人
hql = "from Person p where p.name='Jack'";
3: 以下只查询所有用户的名称:
hsql = select p.name from Person; // 查询一个字段返回的是List<String>
4: 以下是只查询其中的某个两个字段(如里面已经有10个字段)
// hql = "select * from Person"; //这是错误的,不能使用*. hql - *hsql = select p.name,p.age from Person p; // 查询一个以上字段返回的是List<Object[]>
5:数据封装-返回某些字段,但要求封装成map或是某个JavaBean
hql = select new map(p.name as name,p.age as age) from Peson p ;// person中的name为key,age为value存入map,再将map存入list,注意,必须写as关键字
hql = select new JavaBean(p.name,p.age) from Peson p;//要求JavaBean提供一个接收参数的构造
6:关联查询-被关联的子表,应该是主表类的一个属性, 所有的关联,即inner joion都是通过主类的属性连接出来的。
- 以下查询拥有Beanz车的主人select p.name,c.name from Peson p join p.cars c where c.name='Benz';
- 以下查询拥有两部的车的人:
from Person p where p.cars.size=2
注意:p.cars是一个集合,同时它还在这个集合中,映射了一个类,所以此别名,即c同时拥有两个属性一个是List的,一个是Car这个类的。
一些其他的例子:
from User user where user.age=20;
from User user where user.age between 20 and 30;
from User user where user.age in(20,30);
from User user where user.name is null;
from User user where user.name like ‘%zx%’;
from User user where (user.age%2)=1;
from User user where user.age=20 and user.name like ‘%zx%’;
二, 实体更新和删除:
String hql=”update User user set user age=20 where user age=18”;
Query queryupdate=session.createQuery(hql);
queryupdate.executeUpdate();String hql=”delete from User user where user age=18”;
Query queryupdate=session.createQuery(hql);
queryupdate.executeUpdate();
三, 分组与排序:
1. Order by:
String hql = “from User user order by user name asc,user age desc”;
2. Group by:
String hql=”select count(user),user age from User user group by user age having count(user)>10”;
四, 参数绑定:
A: 按参数名称绑定: 定义命名参数以:开头
Query query=session.createQuery("from User u where u.name=:customername and u.age=:customerage");
query.setString("customername",name);
query.setInteger("customerage",age);
B: 按参数位置绑定: 用?定义参数位置
Query query=session.createQuery("from User u where u.name=? and u.age =?");
query.setString(0,name);
query.setInteger(1,age);C: setParameter()方法: 绑定任意类型的参数
String hql = "from Dept d where d.name=:deptname";
Query query = sess.createQuery(hql);
query.setParameter("deptname", "PHP培训班", Hibernate.STRING);
setParameter()方法包含三个参数,分别是: 命名参数名称,命名参数实际值,以及命名参数映射类型D: setProperties()方法: 将命名参数与一个对象的属性值绑定在一起
Customer.customer=new Customer();
customer.setName("pansl");
customer.setAge(80);
Query query=session.createQuery("from Customer c where c.name=:name and c.age=:age");
query.setProperties(customer);
拓展: HQL语句
public void testQuery2(){
Session sess = HibernateUtils.getSession();
sess.beginTransaction();
String hql = "from Person p where p.id=2"; // Person是javabean, p理解成Person类的对象
Query query = sess.createQuery(hql);
List persons = query.list();
System.out.println(persons);
sess.getTransaction().commit();
}
String hql = "from Person p where p.imgs.size=3"; // 查出set集合大小为3的