Главная страница
Навигация по странице:

  • INSERT Мы используем ключевое слово INSERT

  • SELECT Если мы хотим получить запись из таблицы нашей БД, то мы должны использоваьб ключевое слово SELECT

  • WHERE В том случае, если мы хотим получить объекты, которые соответствуют опредлённым параметрам, то мы должны использовать ключевое слово WHERE

  • GROUP BY С помощью ключевого слова GROUP BY

  • Методы аггрегации Язык запросов Hibernate (HQL) пожжерживает различные методы аггрегации, которые доступны и в SQL. HQL поддреживает слудующие методы:min(имя свойства)

  • Запросы с использованием Criteria

  • Руководство по Hibernate. Руководство по Hibernate


    Скачать 186.74 Kb.
    НазваниеРуководство по Hibernate
    Дата25.11.2021
    Размер186.74 Kb.
    Формат файлаdocx
    Имя файлаРуководство по Hibernate.docx
    ТипРуководство
    #282046
    страница5 из 7
    1   2   3   4   5   6   7

    Язык запросов Hibernate (HQL).


    HQL (Hibernate Query Language) – это объекто-ориентированный (далее – ОО) язык запросов, который крайне похож на SQL.

    Отличие между HQL и SQL состоит в том, что SQL работает таблицами в базе данных (далее – БД) и их столбацами, а HQL – с сохраняемыми объектами (Persistent Objects) и их полями (аттрибутами класса).

    Hibernate трнаслирует HQL – запросы в понятные для БД SQL – запросы, которые и выполняют необходимые нам действия в БД.

    Мы также имеем возможность испольщовать обычные SQL – запросы в Hibernate используя Native SQL, но использование HQL является более предпочтительным.

    Давайте рассмотрим основные ключевые слова языка HQL:

    FROM

    Если мы хотим загрузить в память наши сохраняемые объекты, то мы будем использовать ключевое слово FROM. Вот пример его использования:
    Query query = session.createQuery("FROM Developer");

    List developers = query.list();
    Developer – это POJO – класс Developer.java, который ассоцииргван с таблицей в шагей БД.

    INSERT
    Мы используем ключевое слово INSERT, в том случае, если хотим добавить запись в таблицу нашей БД.

    Вот пример использования этого ключевого слова:
    Query query =

    session.createQuery("INSERT INTO Developer (firstName, lastName, specialty, experience)");
    UPDATE
    Ключевое слово UPDATE используется для обновления одного или нескольких полей объекта. Вот так это выглядит на практике:
    Query query =

    session.createQuery(UPDATE Developer SET experience =: experience WHERE id =: developerId);

    query.setParameter("expericence", 3);
    DELETE
    Это ключевоеслово используется для удаления одного или нескольких объектов. Пример использования:
    Query query = session.createQuery("DELETE FROM Developer WHERE id = :developerId");

    query.setParameter("developerId", 1);
    SELECT
    Если мы хотим получить запись из таблицы нашей БД, то мы должны использоваьб ключевое слово SELECT. Пример использования:
    Query query = session.createQuery("SELECT D.lastName FROM Developer D");

    List developers = query.list();
    AS
    В предыдущем примере мы использовали запись формы Developer D. С использованием опционального ключевого слова AS это будет выглядеть так:
    Query query = session.createQuery("FROM Developer AS D");

    List developers = query.list();
    WHERE
    В том случае, если мы хотим получить объекты, которые соответствуют опредлённым параметрам, то мы должны использовать ключевое слово WHERE. На практике это выглядит следующим образом:
    Query query = session.createQuery("FROM Developer D WHERE D.id = 1");

    List developer = query.list();
    ORDER BY
    Жля того, чтобы отсортировать список обхектов, полученных в результате запроса, мы должны применить ключевое слово ORDER BY. Нам необходимо укаать параметр, по которому список будет отсортирован и тип сортировки – по возрастанию (ASC) или по убыванию (DESC). В виде кода это выгллядит так:
    Query query =

    session.createQuery("FROM Developer D WHERE experience > 3 ORDER BY D.experience DESC");
    GROUP BY
    С помощью ключевого слова GROUP BY мы можем группировать данные, полученные из БД по какому-либо признаку. Вот простой пример применения данного ключевого слова:
    Query query = session.createQuery("SELECT MAX(D.experience), D.lastName, D.specialty FROM Developer D GROUP BY D.lastName");

    List developers = query.list();
    Методы аггрегации
    Язык запросов Hibernate (HQL) пожжерживает различные методы аггрегации, которые доступны и в SQL. HQL поддреживает слудующие методы:

    min(имя свойства)

    Мнимальное значение данного свойства.

    max(имя свойства)

    Максимальное занчение данного свойтсва.

    sum(имя свойства)

    Сумма всех занчений данного свойтсва.

    avg(имя свойства)

    Среднее арифметическое всех значений данного свойства

    count(имя свойства)

    Какое количество раз данное свойство встречается в результате.

    В данной статье мы ознакомились с основами языка запросов Hibernate (HQL).

    Начало формы

    Конец формы

    Запросы с использованием Criteria

    Hibernate поддерживает различные способы манипулирования объектами и транслирования их в таблицы баз данных (далее – БД). Одним из таких способов является Criteria API, который позволяет нам создавать запросы с критериями, программным методом.

    Для создания Criteria используется метод createCriteria() интерфейса Session. Этот метод возвращает экземпляр сохряаняемого класса (persistent class) в результате его выполнения.

    Вот как это выглядит на практике:
    Criteria criteria = session.createCriteria(Developer.class);

    List developers = criteria.list();
    Criteria имеет два важных метода:

    public Criteria setFirstResult(int firstResult)

    Этот метод указывает первый ряд нашего результата, который начинается с 0.

    public Criteria setMaxResults(int maxResults)

    Этот методограничивает максимальное количество оъектов, которое Hibernate сможет получить в результате запроса.

    Для понимания того, как это работает на практке рассмотрим пример простого приложения.

    Пример:

    Шаг 1. Создадим таблицу HIBERNATE_DEVELOPERS в нашей БД.
    CREATE TABLE HIBERNATE_DEVELOPERS (

    id INT NOT NULL auto_increment,

    FIRST_NAME VARCHAR(50) default NULL,

    LAST_NAME VARCHAR(50) default NULL,

    SPECIALTY VARCHAR(50) default NULL,

    EXPERIENCE INT default NULL,

    SALARY INT default NULL,

    PRIMARY KEY (id)

    );
    Шаг 2. Создадим POJO – класс

    Developer.java
    package net.proselyte.hibernate.criteria;
    public class Developer {

    private int id;

    private String firstName;

    private String lastName;

    private String specialty;

    private int experience;

    private int salary;
    /**

    * Default Constructor

    */

    public Developer() {

    }
    /**

    * Plain constructor

    */

    public Developer(String firstName, String lastName, String specialty, int experience, int salary) {

    this.firstName = firstName;

    this.lastName = lastName;

    this.specialty = specialty;

    this.experience = experience;

    this.salary = salary;

    }
    /**

    * Getters and Setters

    */

    public int getId() {

    return id;

    }
    public void setId(int id) {

    this.id = id;

    }
    public String getFirstName() {

    return firstName;

    }
    public void setFirstName(String firstName) {

    this.firstName = firstName;

    }
    public String getLastName() {

    return lastName;

    }
    public void setLastName(String lastName) {

    this.lastName = lastName;

    }
    public String getSpecialty() {

    return specialty;

    }
    public void setSpecialty(String specialty) {

    this.specialty = specialty;

    }
    public int getExperience() {

    return experience;

    }
    public void setExperience(int experience) {

    this.experience = experience;

    }
    public int getSalary() {

    return salary;

    }
    public void setSalary(int salary) {

    this.salary = salary;

    }
    /**

    * toString method (optional)

    */

    @Override

    public String toString() {

    return "id: " + id +

    "\nFirst Name: " + firstName +

    "\nLast Name: " + lastName +

    "\nSpecialty: " + specialty +

    "\nExperience: " + experience +

    "\nSalary: " + salary + "\n";

    }

    }

    Шаг 3. Создаём конфигурационные файлы

    hibernate.cfg.xml


    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">





    org.hibernate.dialect.MySQLDialect

    com.mysql.jdbc.Driver


    jdbc:mysql://localhost/ИМЯ_ВАШЕЙ_БД

    ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ

    ВАШ_ПАРОЛЬ





    Developer.hbm.xml


    "-//Hibernate/Hibernate Mapping DTD//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">






    This class contains developer details.












    Шаг 4. Создаём класс DeveloperRunner.java

    DeveloperRunner.java
    package net.proselyte.hibernate.criteria;
    import org.hibernate.Criteria;

    import org.hibernate.Session;

    import org.hibernate.SessionFactory;

    import org.hibernate.Transaction;

    import org.hibernate.cfg.Configuration;

    import org.hibernate.criterion.Projections;

    import org.hibernate.criterion.Restrictions;
    import java.util.List;
    public class DeveloperRunner {

    private static SessionFactory sessionFactory;
    public static void main(String[] args) {

    sessionFactory = new Configuration().configure().buildSessionFactory();

    DeveloperRunner developerRunner = new DeveloperRunner();
    System.out.println("Adding developer's records to the database...");

    Integer developerId1 = developerRunner.addDeveloper("Proselyte", "Developer", "Java Developer", 3, 2000);

    Integer developerId2 = developerRunner.addDeveloper("First", "Developer", "C++ Developer", 10, 2000);

    Integer developerId3 = developerRunner.addDeveloper("Second", "Developer", "C# Developer", 5, 2000);

    Integer developerId4 = developerRunner.addDeveloper("Third", "Developer", "PHP Developer", 1, 2000);
    System.out.println("List of Developers with experience more than 3 years:");

    developerRunner.listDevelopersOverThreeYears();
    System.out.println("Total Salary of all Developers:");

    developerRunner.totalSalary();

    sessionFactory.close();

    }
    public Integer addDeveloper(String firstName, String lastName, String specialty, int experience, int salary) {

    Session session = sessionFactory.openSession();

    Transaction transaction = null;

    Integer developerId = null;
    transaction = session.beginTransaction();

    Developer developer = new Developer(firstName, lastName, specialty, experience, salary);

    developerId = (Integer) session.save(developer);

    transaction.commit();

    session.close();

    return developerId;

    }
    public void listDevelopersOverThreeYears() {

    Session session = sessionFactory.openSession();

    Transaction transaction = null;
    transaction = session.beginTransaction();

    Criteria criteria = session.createCriteria(Developer.class);

    criteria.add(Restrictions.gt("experience", 3));

    List developers = criteria.list();
    for (Developer developer : developers) {

    System.out.println("=======================");

    System.out.println(developer);

    System.out.println("=======================");

    }

    transaction.commit();

    session.close();
    }
    public void totalSalary() {

    Session session = sessionFactory.openSession();

    Transaction transaction = null;
    transaction = session.beginTransaction();

    Criteria criteria = session.createCriteria(Developer.class);

    criteria.setProjection(Projections.sum("salary"));
    List totalSalary = criteria.list();

    System.out.println("Total salary of all developers: " + totalSalary.get(0));

    transaction.commit();

    session.close();

    }

    }

    Если всё было сделано правильно, то в резлуьтате работы программы мы получим, примерно, следующий результат:
    /usr/lib/jvm/java-8-oracle/bin/java -Didea.launcher.port=7536 -Didea.launcher.bin.path=/home/proselyte/Programming/Soft/IntellijIdea/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-8-oracle/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-oracle/jre/lib/plugin.jar:/usr/lib/jvm/java-8-oracle/jre/lib/rt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar:/home/proselyte/Programming/IdeaProjects/ProselyteTutorials/Hibernate/target/classes:/home/proselyte/.m2/repository/org/springframework/spring-core/4.1.1.RELEASE/spring-core-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/home/proselyte/.m2/repository/org/springframework/spring-web/4.1.1.RELEASE/spring-web-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-aop/4.1.1.RELEASE/spring-aop-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/home/proselyte/.m2/repository/org/springframework/spring-beans/4.1.1.RELEASE/spring-beans-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-context/4.1.1.RELEASE/spring-context-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar:/home/proselyte/.m2/repository/org/springframework/spring-webmvc/4.1.1.RELEASE/spring-webmvc-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-expression/4.1.1.RELEASE/spring-expression-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/integration/spring-integration-file/4.2.1.RELEASE/spring-integration-file-4.2.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/integration/spring-integration-core/4.2.1.RELEASE/spring-integration-core-4.2.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-messaging/4.2.2.RELEASE/spring-messaging-4.2.2.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/retry/spring-retry/1.1.2.RELEASE/spring-retry-1.1.2.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-tx/4.2.2.RELEASE/spring-tx-4.2.2.RELEASE.jar:/home/proselyte/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar:/home/proselyte/.m2/repository/org/hibernate/hibernate-core/5.1.0.Final/hibernate-core-5.1.0.Final.jar:/home/proselyte/.m2/repository/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final.jar:/home/proselyte/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.1-api/1.0.0.Final/hibernate-jpa-2.1-api-1.0.0.Final.jar:/home/proselyte/.m2/repository/org/javassist/javassist/3.20.0-GA/javassist-3.20.0-GA.jar:/home/proselyte/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/home/proselyte/.m2/repository/org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1.1/geronimo-jta_1.1_spec-1.1.1.jar:/home/proselyte/.m2/repository/org/jboss/jandex/2.0.0.Final/jandex-2.0.0.Final.jar:/home/proselyte/.m2/repository/com/fasterxml/classmate/1.3.0/classmate-1.3.0.jar:/home/proselyte/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar:/home/proselyte/.m2/repository/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar:/home/proselyte/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.0.1.Final/hibernate-commons-annotations-5.0.1.Final.jar:/home/proselyte/.m2/repository/javassist/javassist/3.12.1.GA/javassist-3.12.1.GA.jar:/home/proselyte/.m2/repository/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar:/home/proselyte/Programming/Soft/IntellijIdea/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain net.proselyte.hibernate.criteria.DeveloperRunner

    Feb 23, 2016 1:58:13 PM org.hibernate.Version logVersion

    INFO: HHH000412: Hibernate Core {5.1.0.Final}

    Feb 23, 2016 1:58:13 PM org.hibernate.cfg.Environment

    INFO: HHH000206: hibernate.properties not found

    Feb 23, 2016 1:58:13 PM org.hibernate.cfg.Environment buildBytecodeProvider
    INFO: HHH000021: Bytecode provider name : javassist

    Feb 23, 2016 1:58:14 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager

    INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}

    Feb 23, 2016 1:58:15 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

    WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)

    Feb 23, 2016 1:58:15 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

    INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/PROSELYTE_TUTORIAL]

    Feb 23, 2016 1:58:15 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

    INFO: HHH10001001: Connection properties: {user=root, password=****}

    Feb 23, 2016 1:58:15 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

    INFO: HHH10001003: Autocommit mode: false

    Feb 23, 2016 1:58:15 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections

    INFO: HHH000115: Hibernate connection pool size: 20 (min=1)

    Tue Feb 23 13:58:15 EET 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

    Feb 23, 2016 1:58:16 PM org.hibernate.dialect.Dialect

    INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect

    Adding developer's records to the database...

    List of Developers with experience more than 3 years:

    =======================

    id: 18

    First Name: First

    Last Name: Developer

    Specialty: C++ Developer

    Experience: 10

    Salary: 2000
    =======================

    =======================

    id: 19

    First Name: Second

    Last Name: Developer

    Specialty: C# Developer

    Experience: 5

    Salary: 2000
    =======================

    Total Salary of all Developers:

    Total salary of all developers: 8000

    Feb 23, 2016 1:58:16 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop

    INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost/PROSELYTE_TUTORIAL]

    В этой статье мы изучили основы запросов с критериями (Criteria Queries) и рассмотрели пример их применения.
    1   2   3   4   5   6   7


    написать администратору сайта