Hibernate-네이티브 SQL
Oracle에서 쿼리 힌트 또는 CONNECT 키워드와 같은 데이터베이스 특정 기능을 활용하려는 경우 네이티브 SQL을 사용하여 데이터베이스 쿼리를 표현할 수 있습니다. Hibernate 3.x를 사용하면 모든 생성, 업데이트, 삭제 및로드 작업에 대해 저장 프로 시저를 포함하여 수기 SQL을 지정할 수 있습니다.
애플리케이션은 세션에서 네이티브 SQL 쿼리를 생성합니다. createSQLQuery() 세션 인터페이스의 방법-
public SQLQuery createSQLQuery(String sqlString) throws HibernateException
SQL 쿼리가 포함 된 문자열을 createSQLQuery () 메서드에 전달한 후 SQL 결과를 기존 Hibernate 엔터티, 조인 또는 addEntity (), addJoin () 및 addScalar () 메서드를 사용하여 스칼라 결과와 연결할 수 있습니다. 각기.
스칼라 쿼리
가장 기본적인 SQL 쿼리는 하나 이상의 테이블에서 스칼라 (값) 목록을 가져 오는 것입니다. 다음은 스칼라 값에 네이티브 SQL을 사용하는 구문입니다.
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();
항목 쿼리
위의 쿼리는 기본적으로 결과 집합에서 "원시"값을 반환하는 스칼라 값 반환에 관한 것입니다. 다음은 addEntity ()를 통해 네이티브 SQL 쿼리에서 엔티티 개체를 전체적으로 가져 오는 구문입니다.
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List results = query.list();
명명 된 SQL 쿼리
다음은 addEntity () 및 명명 된 SQL 쿼리를 사용하여 네이티브 SQL 쿼리에서 엔터티 개체를 가져 오는 구문입니다.
String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
query.setParameter("employee_id", 10);
List results = query.list();
네이티브 SQL 예
다음 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 () 메소드를 사용하여 애플리케이션 클래스를 생성하여 사용할 애플리케이션을 실행합니다. Native SQL 쿼리-
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.SQLQuery;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
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 employees and their salary using Scalar Query */
ME.listEmployeesScalar();
/* List down complete employees information using Entity Query */
ME.listEmployeesEntity();
}
/* 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 using Scalar Query */
public void listEmployeesScalar( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List data = query.list();
for(Object object : data) {
Map row = (Map)object;
System.out.print("First Name: " + row.get("first_name"));
System.out.println(", Salary: " + row.get("salary"));
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to READ all the employees using Entity Query */
public void listEmployeesEntity( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List employees = query.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();
}
}
}
컴파일 및 실행
위에서 언급 한 애플리케이션을 컴파일하고 실행하는 단계는 다음과 같습니다. 컴파일 및 실행을 계속하기 전에 PATH 및 CLASSPATH를 적절하게 설정했는지 확인하십시오.
설정 장에서 설명한대로 hibernate.cfg.xml 설정 파일을 생성합니다.
위와 같이 Employee.hbm.xml 매핑 파일을 생성합니다.
위와 같이 Employee.java 소스 파일을 생성하고 컴파일합니다.
위와 같이 ManageEmployee.java 소스 파일을 생성하고 컴파일합니다.
ManageEmployee 바이너리를 실행하여 프로그램을 실행하십시오.
다음과 같은 결과가 나오고 EMPLOYEE 테이블에 레코드가 생성됩니다.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara, Salary: 2000
First Name: Daisy, Salary: 5000
First Name: John, Salary: 5000
First Name: Mohd, Salary: 3000
First Name: Zara Last Name: Ali Salary: 2000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
EMPLOYEE 테이블을 확인하면 다음과 같은 레코드가 있어야합니다.
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 26 | Zara | Ali | 2000 |
| 27 | Daisy | Das | 5000 |
| 28 | John | Paul | 5000 |
| 29 | Mohd | Yasee | 3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)
mysql>