최대 절전 모드-기준 쿼리
Hibernate는 객체를 조작하는 대체 방법을 제공하고 차례로 RDBMS 테이블에서 사용 가능한 데이터를 제공합니다. 방법 중 하나는 필터링 규칙 및 논리적 조건을 적용 할 수있는 조건 쿼리 개체를 프로그래밍 방식으로 구축 할 수있는 Criteria API입니다.
최대 절전 모드 Session 인터페이스 제공 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"));
다음과 같이 LogicalExpression 제한을 사용하여 AND 또는 OR 조건을 만들 수 있습니다.
Criteria cr = session.createCriteria(Employee.class);
Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");
// To get records matching with OR conditions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );
// To get records matching with AND conditions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );
List results = cr.list();
위의 모든 조건은 이전 자습서에서 설명한대로 HQL에서 직접 사용할 수 있습니다.
기준을 사용한 페이지 매김
페이지 매김을위한 Criteria 인터페이스에는 두 가지 방법이 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public Criteria setFirstResult(int firstResult) 이 메서드는 결과 집합의 첫 번째 행을 나타내는 정수를 취하며 행 0부터 시작합니다. |
2 | public Criteria setMaxResults(int maxResults) 이 메소드는 Hibernate에게 고정 된 숫자를 검색하도록 지시합니다. maxResults 개체의. |
위의 두 가지 방법을 함께 사용하면 웹 또는 스윙 애플리케이션에서 페이징 구성 요소를 구성 할 수 있습니다. 다음은 한 번에 10 개의 행을 가져 오도록 확장 할 수있는 예입니다.
Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();
결과 정렬
Criteria 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
cr.addOrder(Order.desc("salary"));
// To sort records in ascending order
cr.addOrder(Order.asc("salary"));
List results = cr.list();
프로젝션 및 집계
Criteria API는 org.hibernate.criterion.Projections속성 값의 평균, 최대 또는 최소를 가져 오는 데 사용할 수있는 클래스입니다. Projections 클래스는 Restrictions 클래스와 유사합니다.Projection 인스턴스.
다음은 다양한 시나리오를 다루는 몇 가지 예이며 요구 사항에 따라 사용할 수 있습니다.
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"));
기준 쿼리 예
다음 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's count */
ME.countEmployee();
/* Print Total 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)
mysql>