최대 절전 모드 쿼리 언어 (HQL)는 SQL과 유사한 객체 지향 쿼리 언어이지만 테이블 및 열에서는 작동하지 않습니다. HQL은 지속적인 물체와 그 특성에 적합합니다. HQL 쿼리는 최대 절전 모드에서 기존 SQL 쿼리로 변환되며, 이는 원의 데이터베이스에서 작업을 수행합니다.
SQL 문 및 최대 절전 모드와 함께 기본 SQL을 직접 사용할 수는 있지만 HQL을 사용하여 가능한 한 번거 로움의 번거 로움을 피하고 Hibernate의 SQL 생성 및 캐싱 전략의 장점을 채택하는 것이 좋습니다.
Select, From 및 Where와 같은 키워드는 사례에 민감하지만 테이블 이름 및 열 이름과 같은 속성은 HQL에 민감합니다.
성명서에서
완전한 지속적인 개체를 메모리에로드하려면 From Clause를 사용하십시오. 다음은 From Clause를 사용하는 간단한 구문입니다.
문자열 HQL = "직원에서"; query query = session.createquery (HQL); list results = query.list ();HQL에서 클래스 이름을 완전히 자격을 갖추어야하는 경우 다음 패키지 및 클래스 이름 만 지정하십시오.
문자열 HQL = "com.hibernatebook.criteria.employee"에서 "query query = session.createquery (HQL); list results = query.list ();
성명서로
AS 절은 특히 쿼리가 매우 긴 경우 클래스에서 HQL 쿼리에 별칭을 할당하는 데 사용될 수 있습니다. 예를 들어, 위의 간단한 예는 다음과 같습니다.
문자열 HQL = "Employee as e"; query query = session.createquery (HQL); list results = query.list ();
AS 키워드는 선택 사항이며 다음과 같이 후속 클래스 이름으로 별명을 직접 지정할 수도 있습니다.
문자열 HQL = "직원 e"; query query = session.createquery (HQL); list results = query.list ();
절을 선택하십시오
SELECT 절은 FROM 절의 결과 세트보다 더 많은 제어를 제공합니다. 전체 객체 대신 객체의 여러 속성을 얻으려면 선택 조항을 사용하십시오. 다음은 SELECT 문을 사용하여 Employee Object를 First_Name 필드로 가져 오는 간단한 구문입니다.
문자열 HQL = "직원에서 e.firstName을 선택하십시오. e"; query query = session.createquery (HQL); list results = query.list ();
여기서 직원 .firstname은 직원 테이블의 필드가 아니라 직원 대상의 속성입니다.
위치 절
스토리지에서 반환 된 특정 객체를 좁히려면 WHERE 절을 사용할 수 있습니다. 다음은 Where 절을 사용하는 간단한 구문입니다.
문자열 HQL = "E.ID = 10"; query query = session.createquery (HQL); list results = query.list ();
절으로 주문하십시오
HQL 쿼리의 결과를 정렬하려면 순서 별 절을 사용해야합니다. 결과를 객체의 속성을 정렬하여 결과에서 결과를 오름차순 (ASC) 또는 내림차순 (DESC)으로 정렬 할 수 있습니다. 다음은 순서 별 절을 사용하는 간단한 구문입니다.
문자열 HQL = "E.ID> 10 Order의 E.Salary desc"; query query = session.createquery (HQL); list results = query.list ();
하나 이상의 속성을 정렬하려면 아래와 같이 쉼표로 구분 된 명령의 끝에 추가 속성을 추가합니다.
String HQL = "E.Id> 10" + "E.FirstName Desc, E.Salary desc"; query query = session.createquery (HQL); list results = query.list ();
절에 의해 그룹
이 조항은 데이터베이스 및 최대 절전 모드의 속성 기반 값 그룹에서 정보를 추출 할 수 있으며 일반적으로 결과를 사용하여 총 값을 포함합니다. 다음은 그룹별 절을 사용하는 간단한 구문입니다.
문자열 HQL = "select sum (e.salary), E.FirstName의 E.FirtName e" + "group e.firstName"; query query = session.createquery (HQL); list results = query.list ();
명명 된 매개 변수를 사용하십시오
Hibernate는 HQL 쿼리 매개 변수에서 지원됩니다. 이를 통해 SQL 주입 공격에서 HQL 쿼리를 방어하지 않고도 사용자의 입력을 쉽게 작성하고 수락 할 수 있습니다. 다음은 명명 된 매개 변수를 사용하는 간단한 구문입니다.
String HQL = "Employee e에서 e.id = : Employee_id"; query query = session.createquery (HQL); query.setparameter ( "Employee_id", 10); list results = query.list ();
업데이트 조항
배치 업데이트는 Hibernate3의 새로운 HQL 및 Hibernate 3 및 Hibernate2와 동일한 다른 삭제 작업입니다. 쿼리 인터페이스에는 HQL 업데이트 또는 삭제 명령문을 실행하기위한 executeUpdate ()라는 메소드가 포함되어 있습니다.
업데이트 절은 하나 이상의 객체에서 하나 이상의 속성을 업데이트하는 데 사용될 수 있습니다. 다음은 업데이트 조항을 사용하는 간단한 구문입니다.
문자열 HQL = "직원 세트 급여 = : SANARY" + "where id = : Employee_id"; query query = session.createquery (HQL); query.setparameter ( "Salary", 1000); query.setparameter ( "Employee_id", 10); int result = query.executeupdate ();
조항을 삭제하십시오
삭제 절은 하나 이상의 객체를 삭제하는 데 사용될 수 있습니다. 다음은 삭제 절을 사용하는 간단한 구문입니다.
문자열 HQL = "Employee" + "where id = : Employee_id"; query query = session.createquery (HQL); Query.setParameter ( "Employee_id", 10); int result = query.executeUpdate (); System.out.println ( "Rows Aptrected :" + Result);
조항 삽입
HQL은 한 객체에서 다른 객체로 레코드 만 삽입 할 수있는 조항에 삽입을 지원합니다. 다음은 삽입 내에서 절단을 사용하는 간단한 구문입니다.
문자열 HQL = "직원에 삽입 (FirstName, LastName, Salary)" + "FirstName, LastName, Old_employee의 Salary"; Query query = session.createquery (HQL); int result = queter.executeupdate (); System.out.println ( "rows infected :" + result);
집계 방법
HQL은 SQL과 유사한 여러 응집 방법을 지원합니다. 이들은 SQL에서 동일한 방식으로 HQL과 다음과 같은 기능 목록을 사용합니다.
별개의 키워드는이 줄에 설정된 고유 한 값 만 계산합니다. 다음 쿼리는 고유 한 수만 리턴합니다.
문자열 HQL = "직원 E"에서 count (고유 E.FirstName); query query = session.createquery (HQL); list results = query.list ();
쿼리 페이지 매김 사용
페이지 매김 쿼리 인터페이스에는 두 가지 방법이 있습니다.
함께 웹 사이트 또는 스윙 애플리케이션에서 페이징 구성 요소를 구축 할 수 있습니다. 예를 들어, 10 줄을 얻기 위해 확장 할 수 있습니다.
문자열 HQL = "직원에서"; query query = session.createquery (HQL); query.setfirstresult (1); query.setMaxResults (10); list results = query.list ();
쿼리 기준
Hibernate는 RDBMS 테이블에서 사용 가능한 대상 및 순차적 데이터를 작동하는 대체 방법을 제공합니다. 이 방법 중 하나는 표준 API로 필터링 규칙 및 논리 조건을 적용 할 수있는 표준 쿼리 객체 프로그래밍을 설정할 수 있습니다.
Hibernate의 세션 인터페이스는 반환 된 지속적인 객체를 작성하는 데 사용할 수있는 클래스 인스턴스를 제공하며 응용 프로그램은 CreateCriteria () 메소드에 조건부 쿼리를 실행합니다.
다음은 직원 클래스에 해당하는 각 객체를 반환하는 가장 간단한 조건부 쿼리의 예입니다.
기준 cr = session.createCriteria (Employee.class); list results = cr.list ();
제한 및 표준 :
add () 메소드를 사용하여 기준 객체를 사용하여 제한 쿼리를 추가 할 수 있습니다. 다음은 2000 년과 같은 급여 반환 레코드로 한도를 추가하는 예입니다.
기준 cr = session.createCriteria (Employee.class); cr.add (제한 .eq ( "Salary", 2000)); list results = cr.list ();
다음은 다른 시나리오를 다루는 몇 가지 예입니다. 필요에 따라 사용할 수 있습니다.
Criteria cr = session.createcriteria (Employee.class); // 급여가 2000cr.add 이상의 급여를받는 레코드를 얻기 위해 (ledrictions.gt ( "Salary", 2000)); // 2000cr.add 미만의 급여를받는 레코드를 얻기 위해 (제한. zaracr.add (제한. 유사 ( "FirstName", "Zara%")); // 위의 제한에 민감한 형태의 사례에 민감한 형태. nullcr.add (gestrictions.isnull ( "Salary")); // 주어진 속성이 nullcr.add가 아닌지 확인하려면 (제한. isnotnull ( "Salary")); // 주어진 속성이 emptycr.add인지 확인하려면 (제한 속성 ( "Salary")); emptycr.add (gestrictions.isnotempty ( "Salary")); 다음 조건을 제한하기 위해 LogicalExpression을 사용하여 생성 및 또는 OR을 만들 수 있습니다. 기준 CR = 세션 .CreateCriteria (Employee.class); 기준 급여 = 제한 .gt ( "급여", 2000); Criterion name = extrictions.ilike ( "firstname", "zara%"); // // 조건부와 일치하는 레코드를 가져 오기 위해 orexp = gestrictions.or (Salary, name); cr.add (orexp); // 조건부와 일치하는 레코드를 얻기 위해 (cr.add); cr.list ();
위의 모든 조건은 이전 자습서에서 HQL을 사용하여 직접 소개 할 수 있지만.
페이징 사용 표준 :
표준 인터페이스,이 페이지 매김을위한 두 가지 방법도 있습니다.
위의 두 가지 방법과 함께 웹 사이트 또는 스윙 애플리케이션에서 페이징 구성 요소를 구축 할 수 있습니다. 다음은 한 번에 10 행을 얻기 위해 확장 할 수있는 예입니다.
Criteria cr = session.createCriteria (Employee.class); Cr.setFirstresult (1); Cr.setMaxResults (10); list results = cr.list ();
정렬 결과 :
표준 API는 org.hibernate.criterion.order 클래스를 객체의 속성에 따라 오름차순 또는 내림차순 순서로 정렬합니다. 이 예제는 주문 클래스의 결과 세트를 사용하여 정렬하는 방법을 보여줍니다.
Criteria cr = session.createcriteria (Employee.class); // 2000cr.add ( "Salary", 2000)) 이상의 판매를 가진 레코드를 얻기 위해 (ordercrit.addord.addord.addord.addord.addord.addord.addord. cr.list ();
예측 및 집계 :
기준 API는 평균, 최대 또는 최소 속성 값을 얻는 데 사용할 수있는 org.hibernate.criterion.projections 클래스를 제공합니다. 투영 클래스는 투영 인스턴스를 얻기위한 몇 가지 정적 공장 방법을 제공하기 때문에 클래스 제한과 유사합니다. 제공
다음은 규정 된대로 사용할 수있는 다양한 체계와 관련된 몇 가지 예입니다.
Criteria cr = session.createCriteria (Employee.class); // 총 행 count.cr.setProjection (projections.rowcount ()); // 속성의 평균을 얻기 위해 (projects.avg ( "Salary")); // properts.cr.setProeject (prosucts.scountsinct를 얻기 위해); property.cr.setProjection (projections.max ( "Salary")); // property.cr.setProjection (projects.min ( "Salary")); // 속성의 합계를 얻습니다 (projections.sum ( "Salary"));
기준 쿼리 예 :
다음 pojo 클래스를 고려하십시오.
공공 클래스 직원 {private int id; 개인 문자열 firstName; 개인 문자열 마지막 이름; 개인 INT 급여; 공공 직원 () {} 공공 직원 (문자열 fname, 문자열 lname, int 월급) {this.firstname = fname; this.lastname = lname; this.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 () {반환 급여; } public void setSalary (int 급여) {this.salary = 월급; }}직원 개체를 저장하기 위해 다음 직원 테이블을 만들어 봅시다.
테이블 직원 생성 (id int null auto_increment, first_name varchar (20) 기본 널, last_name varchar (20) 기본 널, 급여 int 기본 널, 기본 키 (id));
다음은 매핑 된 파일입니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype hibernate-mapping public "-// hibernate mapping dtd // en" "http://www.hibernate.org/dtdd/hibernate-mapping-3.0.dtd"> <ClasseMApping> ""Hibernate> " table = "Employee"> <meta attribute = "class-description">이 클래스에는 직원 세부 사항이 포함되어 있습니다. </meta> <id name = "id"type = "int"열 = "id"> <generator/> </id> <속성 이름 = "FirstName"열 = "first_name"type = "string"/> <property name = "lastname"column = "last_name"type = "String"/> <property name = "salary"column = "int"/class> </hibernate ">
마지막으로, 실행할 응용 프로그램 클래스의 Main () 메소드를 작성하고 응용 프로그램의 기준 쿼리를 사용합니다.
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.proections; import org.hibernate.cfg.conflation; 공공 계급 관리자 {Private Constratic Sendractory Factry; public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ( "SessionFactory 객체를 생성하지 못했습니다." + ex); 새로운 예외를 던지십시오. } manageemployee me = new manageemployee (); / * 데이터베이스에 직원 기록이 거의 없습니다. */ Integer Empid1 = Me.addemployee ( "Zara", "Ali", 2000); 정수 Empid2 = Me.addemployee ( "Daisy", "Das", 5000); 정수 empid3 = me.addemployee ( "John", "Paul", 5000); 정수 Empid4 = Me.addemployee ( "Mohd", "Yasee", 3000); / * 모든 직원을 나열하십시오 */ me.listemployee (); / * 총 직원의 카운트 인쇄 */ me.countemployee (); / * print toatl 급여 */ me.totalsalary (); } / * 데이터베이스에서 직원을 생성하는 방법 * / public integer addemployee (String fname, String Lname, int Salary) {세션 세션 = factory.opensession (); 트랜잭션 tx = null; 정수 EmployeeId = null; try {tx = session.begintransaction (); 직원 = 신입 사원 (FNAME, LNAME, 월급); EmployeeId = (Integer) Session.Save (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); } return EmployeeId; } / * 급여를받은 모든 직원을 읽는 방법 2000 이상 * / public void listemployees () {세션 세션 = inctory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); 기준 cr = session.createCriteria (Employee.class); // 제한을 추가합니다. cr.add (제한 .gt ( "급여", 2000)); 목록 직원 = cr.list (); for (iterator iterator = Employegator (); iterator.hasnext ();) {Employee Employee = (Employee) iterator.next (); System.out.print ( "이름 :" + Employee.getFirstName ()); System.out.print ( "성 :" + Employee.getLastName ()); System.out.println ( "급여 :" + Employee.getSalary ()); } tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }} / * 총 레코드 수를 인쇄하는 메소드 * / public void countemployee () {세션 세션 = factory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); 기준 cr = session.createCriteria (Employee.class); // 총 행 카운트를 얻으려면. 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 (); } 마침내 {session.close (); }} / * 급여의 합을 인쇄하는 메소드 * / public void totalSalary () {세션 세션 = factory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); 기준 cr = session.createCriteria (Employee.class); // 총 급여를 받으려면. cr.setProjection (projections.sum ( "Salary")); List TotalSalary = cr.list (); System.out.println ( "총 급여 :" + TotalSalary.get (0)); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }}} 컴파일 및 실행 :
위의 응용 프로그램을 컴파일하고 실행하는 단계는 다음과 같습니다. 컴파일하고 실행하기 전에 경로와 클래스 경로를 적절하게 설정했는지 확인하십시오.
다음 결과가 얻어지고 직원 테이블에서 기록이 작성됩니다.
$ java manageemployee
..... 다양한 로그 메시지가 여기에 표시됩니다 ......... 이름 : 데이지 성 : DAS 급여 : 5000First 이름 : John 성 : Paul Salary : 5000first 이름 : Mohd 성 : Yasee Salary : 3000total Coint : 4Total Salary : 15000
직원 테이블을 확인하면 다음과 같이 기록해야합니다.
MySQL> 직원에서 선택 *;
+-----------------------------------+| id | First_name | Last_name | 샐러리 |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------