• hibernate之HQL


    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程序负责生成标识符。不建议采用。

    5.注解开发

    1)注解说明

    @Entity 声明一个实体

    @Table来描述类与表对应

    @Id来声明一个主键

    @GenerateValue 用它来声明一个主键生成策略

    @Column来定义列

    @Temporal来声明日期类型,可选择以下三种

    1.TemporalType.DATA   只有年月日  

    2.TemporalType.TIME   只有小时分钟秒

    3.TemporalType.TIMESTAMP 有年月日小时分钟秒

    2)案例

    1.创建实体类映射关系

    package com.fqh.entity;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "student")
    public class Student {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        @Column(name = "name")
        private String name;
        @Column(name = "sex")
        private String sex;
        @Column(name = "age")
        private int age;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
    }

    2.创建测试类,操作数据库

        @Test
        public void test1() {
            Configuration configure = new Configuration().configure();
            //创建session会话工厂
            SessionFactory sessionFactory = configure.buildSessionFactory();
            //通过工厂获取一个session
            Session session = sessionFactory.openSession();
            //操作数据库
            session.beginTransaction();
            Student student=new Student();
            student.setAge(23);
            student.setName("刘超");
            student.setSex("男");
            session.save(student);
            session.getTransaction().commit();
            session.close();
            sessionFactory.close();
        }

    3.在hibernate.cfg.xml中开启类扫描

    <mapping class="com.fqh.entity.Student"/>

    3)一对一

    1.创建person类

    package com.fqh.entity;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "person")
    public class Person {
        @OneToOne(targetEntity = IdCard.class,cascade = CascadeType.ALL)
        @JoinColumn(name = "c_id",unique = true)
        private IdCard idCard;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        @Column(name = "name")
        private String name;
        public IdCard getIdCard() {
            return idCard;
        }
        public void setIdCard(IdCard idCard) {
            this.idCard = idCard;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    
    }

    2.创建IdCard类

    package com.fqh.entity;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "person")
    public class Person {
        @OneToOne(targetEntity = IdCard.class,cascade = CascadeType.ALL)
        @JoinColumn(name = "c_id",unique = true)
        private IdCard idCard;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        @Column(name = "name")
        private String name;
        public IdCard getIdCard() {
            return idCard;
        }
        public void setIdCard(IdCard idCard) {
            this.idCard = idCard;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    3.创建测试类

        @Test
        public void test2() {
            Configuration configure = new Configuration().configure();
            //创建session会话工厂
            SessionFactory sessionFactory = configure.buildSessionFactory();
            //通过工厂获取一个session
            Session session = sessionFactory.openSession();
            //操作数据库
            session.beginTransaction();
            Person person=new Person();
            person.setName("张三");
            IdCard idCard=new IdCard();
            idCard.setIdNum("429006153358623");
            person.setIdCard(idCard);
            idCard.setPerson(person);
            session.save(person);
            session.getTransaction().commit();
            session.close();
            sessionFactory.close();
        }

    一点点学习,一丝丝进步。不懈怠,才不会被时代所淘汰!

  • 相关阅读:
    server 2012 r2 配置
    在线流媒体nginx/Windows解决方案
    ECS上配置FTP Filezilla
    新项目扫雷专贴 备忘录
    如何解决 Windows 实例出现身份验证错误及更正 CredSSP
    win10 再次重装系统
    SAI窗口无法移动
    无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支
    遇到技嘉 Gigabyte UEFI DualBIOS问题
    dnsunlocker解决
  • 原文地址:https://www.cnblogs.com/fqh2020/p/12005612.html
Copyright © 2020-2023  润新知