> Java > java지도 시간 > 본문

Java의 Hibernate 프레임워크에서 데이터베이스 데이터 쿼리

高洛峰
풀어 주다: 2017-01-23 10:03:39
원래의
1302명이 탐색했습니다.

HQL(Hibernate Query Language)은 SQL과 유사한 객체 지향 쿼리 언어이지만 테이블과 열에서 작동하는 대신 영구 객체 및 해당 속성에 적합합니다. HQL 쿼리는 Hibernate에 의해 데이터베이스에서 작업을 수행하는 전통적인 SQL 쿼리로 변환됩니다.

SQL 문을 직접 사용하고 Hibernate에서 Native SQL을 사용하는 것도 가능하지만 데이터베이스 이식성 문제를 최대한 피하고 Hibernate의 SQL 생성 및 캐싱 전략을 활용하려면 HQL을 사용하는 것이 좋습니다.

SELECT, FROM 및 WHERE와 같은 키워드는 대소문자를 구분하지 않지만, 테이블 이름 및 열 이름과 같은 속성은 HQL에서 대소문자를 구분합니다.

FROM 문
전체 영구 객체를 메모리에 로드하려면 FROM 절을 사용하세요. 다음은 FROM 절을 사용하는 간단한 구문입니다.

String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

HQL에서 클래스 이름을 정규화해야 하는 경우 다음과 같이 패키지와 클래스 이름을 지정하면 됩니다.

String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

AS 문
AS 절은 특히 매우 긴 쿼리가 있는 경우 클래스에 할당된 HQL 쿼리의 별칭을 지정하는 데 사용할 수 있습니다. 예를 들어 이전의 간단한 예는 다음과 같습니다.

String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

AS 키워드는 선택 사항이며 아래와 같이 후속 클래스 이름에 직접 별칭을 지정할 수도 있습니다.

String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

SELECT 절
SELECT 절은 FROM 절보다 결과 집합에 대한 더 많은 제어를 제공합니다. 전체 개체가 아닌 개체의 여러 속성을 가져오려면 SELECT 절을 사용하세요. 다음은 SELECT 문을 사용하여 Employee 개체의 FIRST_NAME 필드만 가져오는 간단한 구문입니다.

String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

여기서 Employee.firstName이 Employee 개체의 속성이라는 점에 주목할 가치가 있습니다. , EMPLOYEE 테이블의 A 필드가 아닙니다.

WHERE 절
스토리지에서 반환되는 특정 객체의 범위를 좁히고 싶다면 WHERE 절을 사용할 수 있습니다. 다음은 WHERE 절을 사용하는 간단한 구문입니다.

String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

ORDER BY 절
HQL 쿼리 결과를 정렬하려면 ORDER BY 절을 사용해야 합니다. 개체의 속성을 기준으로 결과 집합의 결과를 오름차순(ASC) 또는 내림차순(DESC)으로 정렬할 수 있습니다. 다음은 ORDER BY 절을 사용하는 간단한 구문입니다.

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

두 개 이상의 속성을 기준으로 정렬하려면 쉼표로 구분된 BY 절에 추가 속성을 추가하기만 하면 됩니다. , 아래와 같이 명령 끝에:

String hql = "FROM Employee E WHERE E.id > 10 " +
       "ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

GROUP BY CLAUSE
이 절을 사용하면 속성 값을 기반으로 Hibernate의 데이터베이스 및 그룹에서 정보를 추출할 수 있습니다. 일반적으로 사용되는 결과에는 총계 값이 포함됩니다. 다음은 GROUP BY 절을 사용하는 매우 간단한 구문입니다.

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
       "GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

이름이 지정된 매개변수 사용
Hibernate는 HQL 쿼리에서 이름이 지정된 매개변수를 지원합니다. 이를 통해 SQL 주입 공격을 방어할 필요 없이 사용자의 입력을 받아들이는 HQL 쿼리를 쉽게 작성할 수 있습니다. 다음은 명명된 매개변수를 사용하는 간단한 구문입니다:

String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
로그인 후 복사

UPDATE 절
일괄 업데이트는 Hibernate3이 포함된 HQL의 새로운 기능이며 삭제는 Hibernate 3과 Hibernate2에서 다르게 작동합니다. 이제 Query 인터페이스에는 HQL UPDATE 또는 DELETE 문을 실행하기 위한 ExecuteUpdate()라는 메서드가 포함되어 있습니다.

UPDATE 절을 사용하면 하나 이상의 개체에서 하나 이상의 속성을 업데이트할 수 있습니다. 다음은 UPDATE 절을 사용하는 간단한 구문입니다.

String hql = "UPDATE Employee set salary = :salary " +
       "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
로그인 후 복사

DELETE 절
DELETE 절을 사용하여 하나 이상의 개체를 삭제할 수 있습니다. 다음은 DELETE 절을 사용하는 간단한 구문입니다.

String hql = "DELETE FROM Employee " +
       "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
로그인 후 복사

INSERT 절
HQL은 한 객체에서 다른 객체로 삽입할 수 있는 레코드만 INSERT INTO 절을 지원합니다. 다음은 INSERT INTO 절을 사용하기 위한 간단한 구문입니다.

String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
       "SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
로그인 후 복사

집계 방법
HQL은 SQL과 유사한 여러 집계 방법을 지원합니다. SQL에서와 같은 방식으로 HQL에서 작동하며 사용 가능한 함수 목록은 다음과 같습니다.

DISTINCT 키워드는 해당 행에 설정된 고유 값만 계산합니다. 다음 쿼리는 고유 개수만 반환합니다.

String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
로그인 후 복사

쿼리를 사용한 페이징
페이지를 매긴 쿼리 인터페이스에는 두 가지 방법이 있습니다.

Query setFirstResult(int startPosition)

Query setMaxResults(int maxResult)

위의 두 가지 메소드를 함께 사용하면 웹사이트나 Swing 애플리케이션에서 페이징 컴포넌트를 구축할 수 있습니다. 다음은 10개의 행을 얻기 위해 확장할 수 있는 예입니다.

String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();
로그인 후 복사

쿼리 조건
Hibernate는 RDBMS 테이블에서 사용 가능한 객체 및 순차적 데이터를 조작하는 대체 방법을 제공합니다. 이러한 방법 중 하나는 프로그래밍 방식으로 표준 쿼리 개체를 구축하고 필터링 규칙과 논리적 조건을 적용할 수 있는 표준 API입니다.
Hibernate의 Session 인터페이스는 애플리케이션이 Criteria 객체 createCriteria() 메소드에 대한 조건부 쿼리를 수행할 때 반환되는 영속 객체의 인스턴스를 생성하는 데 사용할 수 있는 Criteria 객체를 제공합니다.

다음은 Employee 클래스에 해당하는 각 개체를 간단히 반환하는 조건부 쿼리의 가장 간단한 예입니다.

Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();
로그인 후 복사

제한사항 및 표준:
add() 메소드를 사용하여 Criteria 객체에 제한 쿼리를 추가할 수 있습니다. 다음은 2000과 동일한 급여 반환 기록에 제한을 추가하는 예입니다.

Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq("salary", 2000));
List results = cr.list();
로그인 후 복사

다음은 다양한 시나리오를 다루고 요구 사항에 따라 사용할 수 있는 몇 가지 예입니다.

Criteria cr = session.createCriteria(Employee.class);
 
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
 
// To get records having salary less than 2000
cr.add(Restrictions.lt("salary", 2000));
 
// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));
 
// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
 
// To get records having salary in between 1000 and 2000
cr.add(Restrictions.between("salary", 1000, 2000));
 
// To check if the given property is null
cr.add(Restrictions.isNull("salary"));
 
// To check if the given property is not null
cr.add(Restrictions.isNotNull("salary"));
 
// To check if the given property is empty
cr.add(Restrictions.isEmpty("salary"));
 
// To check if the given property is not empty
cr.add(Restrictions.isNotEmpty("salary"));
可以创建AND或OR使用LogicalExpression限制如下条件:
 
Criteria cr = session.createCriteria(Employee.class);
 
Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");
 
// To get records matching with OR condistions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );
 
 
// To get records matching with AND condistions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );
 
List results = cr.list();
로그인 후 복사

위의 모든 조건이 적용되는 동안, 이전 튜토리얼에서 소개한 대로 HQL을 바로 사용할 수 있습니다.

페이징 사용 표준:
또한 표준 인터페이스와 두 가지 페이징 방법이 있습니다.

공개 기준 setFirstResult(int firstResult)

public Criteria setMaxResults(int maxResults)

采用上述两种方法一起,我们可以在我们的网站或Swing应用程序构建一个分页组件。下面是例子,可以扩展来每次获取10行:

Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();
로그인 후 복사

排序的结果:
标准的API提供了org.hibernate.criterion.Order类排序按升序或降序排列你的结果集,根据对象的属性。这个例子演示了如何使用Order类的结果集进行排序:

Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
 
// To sort records in descening order
crit.addOrder(Order.desc("salary"));
 
// To sort records in ascending order
crit.addOrder(Order.asc("salary"));
 
List results = cr.list();
로그인 후 복사

预测与聚合:
该Criteria API提供了一个org.hibernate.criterion.Projections类可用于获取平均值,最大值或最小值的属性值。Projections类是类似于类限制,因为它提供了几个静态工厂方法用于获得Projection 实例。 provides the

以下是涉及不同的方案的一些例子,可按规定使用:

Criteria cr = session.createCriteria(Employee.class);
 
// To get total row count.
cr.setProjection(Projections.rowCount());
 
// To get average of a property.
cr.setProjection(Projections.avg("salary"));
 
// To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName"));
 
// To get maximum of a property.
cr.setProjection(Projections.max("salary"));
 
// To get minimum of a property.
cr.setProjection(Projections.min("salary"));
 
// To get sum of a property.
cr.setProjection(Projections.sum("salary"));
로그인 후 복사

Criteria Queries 例子:
考虑下面的POJO类:

public class Employee {
  private int id;
  private String firstName;
  private String lastName; 
  private int salary;
 
  public Employee() {}
  public Employee(String fname, String lname, int salary) {
   this.firstName = fname;
   this.lastName = lname;
   this.salary = salary;
  }
  public int getId() {
   return id;
  }
  public void setId( int id ) {
   this.id = id;
  }
  public String getFirstName() {
   return firstName;
  }
  public void setFirstName( String first_name ) {
   this.firstName = first_name;
  }
  public String getLastName() {
   return lastName;
  }
  public void setLastName( String last_name ) {
   this.lastName = last_name;
  }
  public int getSalary() {
   return salary;
  }
  public void setSalary( int salary ) {
   this.salary = salary;
  }
}
로그인 후 복사

让我们创建下面的EMPLOYEE表来存储Employee对象:

create table EMPLOYEE (
  id INT NOT NULL auto_increment,
  first_name VARCHAR(20) default NULL,
  last_name VARCHAR(20) default NULL,
  salary   INT default NULL,
  PRIMARY KEY (id)
);
로그인 후 복사

以下将被映射文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 
<hibernate-mapping>
  <class name="Employee" table="EMPLOYEE">
   <meta attribute="class-description">
     This class contains the employee detail.
   </meta>
   <id name="id" type="int" column="id">
     <generator class="native"/>
   </id>
   <property name="firstName" column="first_name" type="string"/>
   <property name="lastName" column="last_name" type="string"/>
   <property name="salary" column="salary" type="int"/>
  </class>
</hibernate-mapping>
로그인 후 복사

最后,我们将创建应用程序类的main()方法来运行,我们将使用Criteria查询的应用程序:

import java.util.List;
import java.util.Date;
import java.util.Iterator;
  
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projections;
import org.hibernate.cfg.Configuration;
 
public class ManageEmployee {
  private static SessionFactory factory;
  public static void main(String[] args) {
   try{
     factory = new Configuration().configure().buildSessionFactory();
   }catch (Throwable ex) {
     System.err.println("Failed to create sessionFactory object." + ex);
     throw new ExceptionInInitializerError(ex);
   }
   ManageEmployee ME = new ManageEmployee();
 
   /* Add few employee records in database */
   Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);
   Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
   Integer empID3 = ME.addEmployee("John", "Paul", 5000);
   Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);
 
   /* List down all the employees */
   ME.listEmployees();
 
   /* Print Total employee&#39;s count */
   ME.countEmployee();
 
   /* Print Toatl salary */
   ME.totalSalary();
  }
  /* Method to CREATE an employee in the database */
  public Integer addEmployee(String fname, String lname, int salary){
   Session session = factory.openSession();
   Transaction tx = null;
   Integer employeeID = null;
   try{
     tx = session.beginTransaction();
     Employee employee = new Employee(fname, lname, salary);
     employeeID = (Integer) session.save(employee);
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace();
   }finally {
     session.close();
   }
   return employeeID;
  }
 
  /* Method to READ all the employees having salary more than 2000 */
  public void listEmployees( ){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);
     // Add restriction.
     cr.add(Restrictions.gt("salary", 2000));
     List employees = cr.list();
 
     for (Iterator iterator =
              employees.iterator(); iterator.hasNext();){
      Employee employee = (Employee) iterator.next();
      System.out.print("First Name: " + employee.getFirstName());
      System.out.print(" Last Name: " + employee.getLastName());
      System.out.println(" Salary: " + employee.getSalary());
     }
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace();
   }finally {
     session.close();
   }
  }
  /* Method to print total number of records */
  public void countEmployee(){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);
 
     // To get total row count.
     cr.setProjection(Projections.rowCount());
     List rowCount = cr.list();
 
     System.out.println("Total Coint: " + rowCount.get(0) );
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace();
   }finally {
     session.close();
   }
  }
 /* Method to print sum of salaries */
  public void totalSalary(){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);
 
     // To get total salary.
     cr.setProjection(Projections.sum("salary"));
     List totalSalary = cr.list();
 
     System.out.println("Total Salary: " + totalSalary.get(0) );
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace();
   }finally {
     session.close();
   }
  }
}
로그인 후 복사

编译和执行:
下面是步骤来编译并运行上述应用程序。请确保您已在进行的编译和执行之前,适当地设置PATH和CLASSPATH。

创建hibernate.cfg.xml配置文件中配置章节解释。

创建Employee.hbm.xml映射文件,如上图所示。

创建Employee.java源文件,如上图所示,并编译它。

创建ManageEmployee.java源文件,如上图所示,并编译它。

执行ManageEmployee二进制运行程序.

会得到以下结果,并记录将创建在EMPLOYEE表中。

$java ManageEmployee
로그인 후 복사
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
 
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
Total Coint: 4
Total Salary: 15000
로그인 후 복사

如果检查EMPLOYEE表,它应该记录如下:

mysql> select * from EMPLOYEE;
로그인 후 복사
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 14 | Zara    | Ali    |  2000 |
| 15 | Daisy   | Das    |  5000 |
| 16 | John    | Paul   |  5000 |
| 17 | Mohd    | Yasee   |  3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)
로그인 후 복사

更多在Java的Hibernate框架中对数据库数据进行查询操作相关文章请关注PHP中文网!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!