一. Hibernate的HQL语句
hql,全称是 Hibernate Query Language ,即Hibernate 查询语言。 是Hibernate对SQL语句的相应的封装,试图用ORM的思想重新构造生成数据表查询。 其中,实体类对应数据表,实体类对应视图,实体属性对应表的字段,类名对应表名。 session. get() ,session.load() 只是最简单的查询形式。
二. 只讲单表的查询
创建一个单表User ,其中只有简单的属性,id,name,sex,age,具体详情可查看以前的文章。 这里插入四条数据:
三.各种各样的查询
三.一 全量查
/** * 查询全部的普通测试 */ @Test public void Test1(){ Session session=HibernateUtil.getSession(); String hql="From User"; //User是类名,并不是数据表名。 Query hqlQuery=session.createQuery(hql); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
这里,并不能将其小写, from user,
也不能select * from User。
三.二 条件不传值查询
@Test public void Test2(){ Session session=HibernateUtil.getSession(); String hql="From User u where u.name='两个蝴蝶飞' and u.age=24 order by u.id"; Query hqlQuery=session.createQuery(hql); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
可以放置正常的参数,也可以进行排序 order by .
均可以正确的查询,不再继续贴查询结果了。
三.三 ?形式传值
@Test public void Test3(){ Session session=HibernateUtil.getSession(); String hql="From User u where u.name=? and u.age=?"; Query hqlQuery=session.createQuery(hql); //如果知道确切的类型,可以用具体的类型 已经过时了。 hqlQuery.setString(0,"两个蝴蝶飞"); hqlQuery.setInteger(1,24); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
可以直接用setString, setInteger 进行赋值。 从0开始,注意起始位置 。但是这种方式已经不建议使用了。 统一用setParameter() 进行设置.
@Test public void Test3(){ Session session=HibernateUtil.getSession(); String hql="From User u where u.name=? and u.age=?"; Query hqlQuery=session.createQuery(hql); //强烈建议用 setParameter() 来设置值。 hqlQuery.setParameter(0,"两个蝴蝶飞"); hqlQuery.setParameter(1,24); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
三.四 :形式传值
@Test public void Test4(){ Session session=HibernateUtil.getSession(); // 使用属性值,建议用属性名称 String hql="From User u where u.name=:name and u.age=:age"; Query hqlQuery=session.createQuery(hql); hqlQuery.setParameter("name","两个蝴蝶飞"); hqlQuery.setParameter("age",24); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
当然,也可以使用普通的字符串,如 a,b等。
@Test public void Test4(){ Session session=HibernateUtil.getSession(); // 不建议使用无意义的 a,b String hql="From User u where u.name=:a and u.age=:b"; Query hqlQuery=session.createQuery(hql); hqlQuery.setParameter("a","两个蝴蝶飞"); hqlQuery.setParameter("b",24); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
如果传入的是属性的值,那么也可以传入对象进行查询。
@Test public void Test5(){ Session session=HibernateUtil.getSession(); // 使用属性值,用对象进行查询。 String hql="From User u where u.name=:name and u.age=:age"; Query hqlQuery=session.createQuery(hql); User user=new User(); user.setName("两个蝴蝶飞"); user.setAge(24); //利用setProperties 传入对象,进行相应的查询 hqlQuery.setProperties(user); //也可支持Map形式。 List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
建议使用 : 的形式,且参数名与属性名相同。
三.五 like 形式的使用
@Test public void Test6(){ Session session=HibernateUtil.getSession(); // 使用属性名 String hql="From User u where u.name like :name and u.age>:age"; Query hqlQuery=session.createQuery(hql); //构建Map 进行传值 Map<String,Object> map=new HashMap<String,Object>(); map.put("name","%"+"蝴蝶飞"+"%"); //注意like的使用 map.put("age",23); hqlQuery.setProperties(map); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
三.六 ById 的查询单个对象,用uniqueResult
@Test public void Test7(){ Session session=HibernateUtil.getSession(); String hql="From User u where u.id=:id"; Query hqlQuery=session.createQuery(hql); hqlQuery.setParameter("id",1); //确定查询的是单个对象,用uniqueResult(), 当多个时,只返回第一个值。 User user=(User) hqlQuery.uniqueResult(); //进行强制转换 System.out.println(user); session.close(); }
三.七 投影查询,即只查询几列
@Test public void Test8(){ Session session=HibernateUtil.getSession(); // 只查询name和age String hql="SELECT u.name,u.age From User u"; Query hqlQuery=session.createQuery(hql); //List<User> userList=hqlQuery.list(); //不支持直接转换成User List<Object []> userList=hqlQuery.list(); //查询出来的是List 对象数组 for (Object[] objects : userList) { //二级循环,进行查询 for (int i = 0; i < objects.length; i++) { Object object = objects[i]; System.out.print(object+","); } System.out.println(); } session.close(); }
三.八 投影查询,返回对象
@Test public void Test9(){ Session session=HibernateUtil.getSession(); // 直接进行相应的构造。 其中,在user类中必须有这样的构造,还有一个空构造函数。 String hql="SELECT new com.yjl.pojo.User(u.name,u.age) From User u"; Query hqlQuery=session.createQuery(hql); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
User 类中必须存在这样的构造。
public User() { super(); } public User(String name, Integer age) { super(); this.name = name; this.age = age; }
三.九 统计函数,如count(),sum()
@Test public void Test10(){ Session session=HibernateUtil.getSession(); //String hql="SELECT count(*) From User u"; String hql="SELECT max(u.age) From User u"; Query hqlQuery=session.createQuery(hql); Object object=hqlQuery.uniqueResult(); //查询出的是单个值,用uniqueResult() System.out.println(object); session.close(); }
三.十 分页查询
@Test public void Test11(){ Session session=HibernateUtil.getSession(); String hql="From User u"; Query hqlQuery=session.createQuery(hql); hqlQuery.setMaxResults(2); //每页显示的数目 hqlQuery.setFirstResult((2-1)*2); //开始处的索引 List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
与条件组合的分页查询为:
public void Test12(){ Session session=HibernateUtil.getSession(); String hql="From User u where u.name like :name and u.age>:age order by u.id desc"; Query hqlQuery=session.createQuery(hql); hqlQuery.setMaxResults(2); hqlQuery.setFirstResult((1-1)*2); //2页时,查询不出来结果 hqlQuery.setParameter("name","%蝴蝶飞%"); hqlQuery.setParameter("age",22); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
@Test public void Test11(){ Session session=HibernateUtil.getSession(); String hql="From User u where u.id in :ids"; Query hqlQuery=session.createQuery(hql); //用setParameterList, 支持数组和集合。 hqlQuery.setParameterList("ids",new Object[]{1,2}); List<User> userList=hqlQuery.list(); userList.forEach(n -> System.out.println(n)); session.close(); }
三.十二 分组查询
@Test public void Test13(){ Session session=HibernateUtil.getSession(); // 按照性别查询,统计数组 String hql="select u.sex,count(*) From User u where u.age >:age group by u.sex having count(*)>1 order by u.id desc"; Query hqlQuery=session.createQuery(hql); hqlQuery.setParameter("age",22); List<Object []> userList=hqlQuery.list(); for (Object[] objects : userList) { for (int i = 0; i < objects.length; i++) { Object object = objects[i]; System.out.print(object+","); } System.out.println(); } session.close(); }
其中,排序可以直接写进HQL 语句中。
四.Query 接口
@Incubating public abstract interface Query<R> extends TypedQuery<R>, org.hibernate.Query<R>, CommonQueryContract { }
由于能力不足,Query 接口,暂时无法解析。 抱歉。
谢谢!!!