Hibernat的HQL语句查询(十六)

简介: Hibernat的HQL语句查询(十六)

一. Hibernate的HQL语句


hql,全称是 Hibernate Query Language ,即Hibernate 查询语言。 是Hibernate对SQL语句的相应的封装,试图用ORM的思想重新构造生成数据表查询。 其中,实体类对应数据表,实体类对应视图,实体属性对应表的字段,类名对应表名。 session. get() ,session.load() 只是最简单的查询形式。


二. 只讲单表的查询


创建一个单表User ,其中只有简单的属性,id,name,sex,age,具体详情可查看以前的文章。 这里插入四条数据:


20190328204306537.png


三.各种各样的查询


三.一 全量查


/**
   * 查询全部的普通测试
   */
  @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();
  }


20190328204451730.png


这里,并不能将其小写, from user,


20190328204601470.png


也不能select * from User。


20190328204635904.png


三.二 条件不传值查询


@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 .


2019032820480081.png


均可以正确的查询,不再继续贴查询结果了。


三.三 ?形式传值


@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
{
}


20190328211317594.png


20190328211348461.png


20190328211410649.png


20190328211429994.png


由于能力不足,Query 接口,暂时无法解析。 抱歉。


谢谢!!!

相关文章
|
SQL XML Oracle
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
392 0
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
|
9月前
|
Java
jpa实现增删改查,分页,自定义查询,jpql查询
jpa实现增删改查,分页,自定义查询,jpql查询
55 0
|
11月前
|
存储
SqlServer存储过程应用二:分页查询数据并动态拼接where条件 (下)
SqlServer存储过程应用二:分页查询数据并动态拼接where条件 (下)
|
11月前
|
存储 SQL 数据库连接
SqlServer存储过程应用二:分页查询数据并动态拼接where条件 (上)
SqlServer存储过程应用二:分页查询数据并动态拼接where条件
|
SQL Java 数据库
一文速学-玩转SQL之执行顺序,单表自连接操作和用法
一文速学-玩转SQL之执行顺序,单表自连接操作和用法
156 0
一文速学-玩转SQL之执行顺序,单表自连接操作和用法
|
SQL 关系型数据库 MySQL
【sql语句基础】——查(select)(单表查询顺序补充)
【sql语句基础】——查(select)(单表查询顺序补充)
|
关系型数据库 MySQL
Mysql查询语句之连表查询和增删改查语句补充
Mysql查询语句之连表查询和增删改查语句补充
172 0
Mysql查询语句之连表查询和增删改查语句补充
|
SQL 关系型数据库 MySQL
Mysql查询语句进阶知识集锦
Mysql查询语句进阶知识集锦
160 0
Mysql查询语句进阶知识集锦
|
SQL 运维 数据库
巧用SQL拼接语句
在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接SQL可以让我们的工作方便很多,达到事半功倍的效果。本篇文章将会分享几个日常会用到的SQL拼接案例,类似的SQL还可以举一反三,探索出更多的可能性哦。
377 0