hibernate之HQL

东方咖啡屋 2019-12-08

1.什么是HQL?

HQL是Hibernate Query Language(Hibernate 查询语言)的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。 HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。

2.HQL查询的步骤

执行HQL查询的步骤:
1、获得HibernateSession对象
2、编写HQL语句
3、调用Session的createQuery方法创建查询对象
4、如果HQL语句包含参数,则调用Query的setXxx方法为参数赋值
5、调用Query对象的list等方法返回查询结果。

3.hibernate查询操作

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

通过Query主要完成查询操作.我们通过Query可以执行hql语句.

Query query=Session.createQuery(hql);

下面这个可以执行sql语句

SQLQuery sqlQuery=Session.createSQLQuery(sql);

SQLQueryQuery的子。

查询全部,使用SQL方式

@Test
    public void test1() {
        Configuration configure = new Configuration().configure();
        //创建session会话工厂
        SessionFactory sessionFactory = configure.buildSessionFactory();
        //通过工厂获取一个session
        Session session = sessionFactory.openSession();
        //操作数据库
        SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
        List<Object[]> list = sqlQuery.list();
        for (Object[] objects : list) {
            System.out.println();
            for (Object object : objects) {
                System.out.print(object+"  ");
            }
        }
    }

也可以通过sqlQuery.addEntity(User.class);这行语句来封装到实体类中

查询全部,使用HQL方式(HQL里面不要出现表名,而是表名对应的类名)

@Test
    public void test2() {
        Configuration configure = new Configuration().configure();
        //创建session会话工厂
        SessionFactory sessionFactory = configure.buildSessionFactory();
        //通过工厂获取一个session
        Session session = sessionFactory.openSession();
        //操作数据库
        Query query = session.createQuery("from User");
        List list = query.list();
        System.out.println(list);
    }

hibernate实现分页查询

在query中加入以下代码

     //开始的位置
        query.setFirstResult(1);
        //从开始朝后面查几个
        query.setMaxResults(1);

查询表一个字段,并封装在对应实体类中

注意:必须要有该字段对应的构造

@Test
    public void test3() {
        Configuration configure = new Configuration().configure();
        //创建session会话工厂
        SessionFactory sessionFactory = configure.buildSessionFactory();
        //通过工厂获取一个session
        Session session = sessionFactory.openSession();
        //操作数据库
        Query query = session.createQuery("select new User(username) from User");
        List list = query.list();
        System.out.println(list);
    }

4.主键自增策略

increment:代理主键。由hibernate维护一个变量,每次生成主键时自动以递增。问题:如果有多个应用访问一个数据库,由于每个应用维护自己的主键,所以此时主键可能冲突。建议不采用。

identity:代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如:mysql的自增主键,oracle不支持主键自动生成。如果数据库支持自增建议采用。

sequence:代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。如果数据库支持序列建议采用。

native:代理主键。根据底层数据库对自动来选择identity、sequence、hilo由于生成主键策略的控制权由hibernate控制,所以不建议采用。

uuid:代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符。此策略可以保证生成主键的唯一性,并且提供了最好的数据库插入性能和数据库平台的无关性。建议采用。

assigned:自然主键。由java程序负责生成标识符。不建议采用。

相关推荐