`
snake_hand
  • 浏览: 624693 次
社区版块
存档分类
最新评论

使用HQL查询

 
阅读更多

欢迎大家访问我的个人网站 萌萌的IT人

    HQL是Hibernate Query Language的缩写,语法很想SQL,但是HQL是一种面向对象的查询语言。SQL的操作对象是数据列、表等数据库对象,而HQL操作的是类、实例、属性。

  HQL查询依赖于Query类,每个Query实例对应一个查询对象,使用HQL查询按如下步骤进行:

  1.获取Hibernate Session对象

  2.编写HQL语句

  3.以HQL语句作为参数,调用Session的createQuery方法创建查询对象

  4.如果HQL语句包含参数,则调用Query的setXxx方法为参数赋值

  5.调用Query独享的list()或uniqueResult()方法返回查询结果列表

简单的例子:

复制代码
@SuppressWarnings("deprecation")
public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    
    static {
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    }
    
    public static Session getOpenSession() {
        return sessionFactory.openSession();
    }
    
    public static Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }
}
复制代码

 

复制代码
@Entity
public class Employee {

    private Integer id;
    private String name;
    private Integer age;
    
    @Id
    @GeneratedValue
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    @Basic
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Basic
    public Integer getAge() {
        return age;
    }
    
    public void setAge(Integer age) {
        this.age = age;
    }
    
    public String toString() {
        return "id:" + id + "   " + "name:" + name +  "   " + "age:" + age;
    }
}
复制代码
复制代码
@SuppressWarnings("all")
public class HQLDemo {

    @Test
    public void testHQL() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }
    
    @Test
    public void testHQLHasParameter() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e where e.name = :personName").setString("personName", "xujianguo").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }
}
复制代码

 

  HQL查询的from子句:

from是最简单的HQL语句,也是最基本的HQL语句,from关键字后紧跟持久化类的类名,如:

from Employee

表名从Employee类中选出全部的实例

不过我们常用的是这样做:

from employee as e

这个e就是Employee的别名,也就是实例名,推荐这么写。

 

  HQL查询的select子句:

  select子句用于选择指定的属性或直接选择某个实体,当然select选择的属性必须是from后持久化类包含的属性,如:

select e.name from Employee as e

  select可以选择任意属性,即不仅可以选择持久化类的直接属性,还可以选择组件属性包含的属性,如:

select e.name.firstName from Employee as e

 

  HQL查询的聚集函数:

  聚集函数:  

    avg:计算属性的平均值

    count:统计选择对象的数量

    max:统计属性值的最大值

    min:统计属性值的最小值

    sum:计算属性值的总和

如:

select count(*) from Employee as e

 

    @Test
    public void testHQLFunction() {
        Session session = HibernateUtil.getOpenSession();
        System.out.println(session.createQuery("select count(*) from Employee as e").uniqueResult());
    }

 

  多态查询:

  HQL不仅会查询出该持久化类的全部实例,还会查询出该类的子类的全部实例,前提是存在继承映射。

 

  HQL查询的where子句:

  where子句主要用于筛选选中的结果,缩小选择的范围,如:

from employee as e where e.name like "xjg%"
复制代码
    @Test
    public void testHQLWhere() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e where e.name like 'zhou%'").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }
复制代码

 

  order by子句:

  查询返回结合可以根据类或组件属性的任何属性进行排序,还可以使用asc或desc关键字指定升序或者降序,如:

from Employee as e order by e.name desc

 

  子查询:

  子查询中就是查询语句中还有查询语句,如:

from Employee as e where e.age > (select p.age from Person as p)

 

复制代码
    @Test
    public void testHQLChildQuery() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e where e.age > (select e1.age from Employee as e1 where e1.name = 'xujianguo')").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }
复制代码

 

  命名查询:

  HQL查询还支持将查询所用的HQL语句放入配置文件中,而不是代码中,在Hibernate映射文件的<hibernate-mapping>元素中使用<query>子元素来定义命名查询,这个<query>元素只需指定一个name属性,指定该命名查询的名字 ,如:

<query name="query">
    from Employee as e
<query />

  Session里提供了一个getNamedQuery(String name)方法,该方法用于创建一个Query对象,一旦获得Query对象,剩下的工作就跟前面的一样了。

复制代码
    @Test
    public void testHQLNamedQuery() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.getNamedQuery("query").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }
复制代码

 

 

 

 

3
1
分享到:
评论

相关推荐

    JPA--HQL查询(手动写原生查询sql,复杂查询必备).pdf

    JPA--HQL查询(手动写原生查询sql,复杂查询必备) JPA(Java Persistence API)是一种JavaEE标准,用于持久化数据,HQL(Hibernate Query Language)是 Hibernate 框架提供的一种查询语言,它允许开发者使用面向...

    hql语句 使用大全

    使用HQL查询所有记录时,可以通过以下格式来实现: ```java String hql = "from com.mypack.User4"; Query query = session.createQuery(hql); List lists = query.list(); ``` 遍历结果集可以采用多种方式,例如: ...

    hibernate 查询?Hibernate的HQL查询

    三、创建和使用HQL查询 在实际项目中,我们通常会创建工具类如HibernateUtils,以方便管理和获取SessionFactory和Session。例如: ```java public class HibernateUtils { private static SessionFactory factory; ...

    hql总条数.txt

    接着,使用`session.createQuery(hql)`创建一个`Query`对象,这将HQL查询语句转换为可执行的对象。 3. **结果处理**:`query.uniqueResult()`方法用于执行HQL查询并返回单个结果。这里假设查询结果是一个数值,因此...

    hibernateHQL基本查询

    与传统的 JDBC 方式相比,使用 HQL 进行数据库查询更加便捷、高效且易于维护。 #### 二、HQL 与 SQL 的区别 - **面向对象**:HQL 主要是基于对象的查询,而 SQL 是基于表的查询。 - **语法差异**:虽然 HQL 的语法...

    Spring中hql语句的常用方法

    在Spring框架中,`HibernateTemplate`类提供了多种方法来执行HQL查询,这些方法可以帮助开发者更加灵活地处理数据查询需求。 1. **find(String queryString)**:此方法接受一个HQL字符串作为参数,返回所有符合条件...

    HQL查询pdf资料

    HQL查询的基本结构包括关键字如`SELECT`、`FROM`、`WHERE`、`GROUP BY`、`HAVING`、`ORDER BY`等,这些关键字的使用与SQL非常相似,但是HQL还支持面向对象的特性,如属性路径表达式。 ##### 实体的更新与删除 在...

    03-HQL实用技术.pdf

    ### HQL实用技术知识点概述 ...通过对以上知识点的学习,可以深入理解HQL在处理不同场景下的应用技巧,特别是关联关系的配置和HQL查询的使用。这些知识不仅有助于提高软件开发的效率,还能提升系统的健壮性和可维护性。

    HQL查询及语法

    此查询使用了`between`关键字来限定时间范围。 6. **结果集别名与映射** - `select p.name as personName from Person as p`: 使用`as`关键字为查询结果的列指定别名,方便后续处理。 - `select new map(p....

    hibernate查询语言--HQL

    在`SimplePropertyQueryTest.java`中,可以使用HQL查询特定属性,例如查询所有名字为"John Doe"的学生。 ```java public class SimplePropertyQueryTest { public void queryByName(Session session) { String ...

    HQL查询.ppt

    HQL查询 帮助文档

    HQL查询语言基础知识

    HQL 中的单表查询使用 FROM 语句,例如:FROM eg.Cat as cat,其中 cat 只是一个别名,为了用其他子语句的时候书写简单。 2.多表查询 HQL 中的多表查询使用 FROM 语句,例如:FROM eg.Cat as cat, eg.Dog as dog。...

    hibernate hql各类查询范例

    以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...

    hibernateHQL关联查询

    ### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...

    SSH笔记-HQL查询、QBC、本地SQL查询

    SSH笔记-HQL查询(基于位置参数查询、基于命名参数查询、分页查询、命名查询、投影查询报表查询、内/迫切内/左外/迫切左外连接查询)、QBC(QBC检索查询、统计查询、排序查询、HQL操作数据库)、本地SQL查询

    HibernateUtil分装完整版HQL查询

    标题"HibernateUtil分装完整版HQL查询"暗示了这是一个关于使用HibernateUtil工具类来封装和执行HQL(Hibernate Query Language)查询的教程或代码示例。描述中的重复信息进一步强调了这个主题,意味着我们将探讨如何...

    Hibernate HQL查询 分页查询 模糊查询.docx

    这里的关键点在于使用`createQuery`方法创建了一个HQL查询对象,并通过`setString`方法设置参数值,最后通过`list`方法执行查询并获取结果列表。 #### 三、分页查询 分页查询在处理大量数据时非常有用,可以有效地...

    Spring中常用的hql查询方法

    此方法使用命名参数来构建HQL查询语句。这种方式可以使查询语句更加清晰易读。 **示例代码**: ```java String queryString = "select count(*) from bean.User u where u.name=:myName"; String paramName = "my...

    Hibernate之HQL查询

    HQL查询的使用极大地提高了开发效率,因为它将数据操作与具体的数据库结构分离。 **1. HQL的基本语法** HQL查询语句结构通常包括以下几个部分:`SELECT`, `FROM`, `WHERE`, `GROUP BY`, `HAVING`, `ORDER BY`。...

Global site tag (gtag.js) - Google Analytics