이 기사의 주요 연구는 다음과 같이 최대 절전 모드 HQL 쿼리의 관련 내용입니다.
HQL (Hibernate Query Language)은 매우 강력한 쿼리 기능을 갖춘 완전히 객체 지향적 인 쿼리 문입니다. 다형성, 연관성 및 기타 특성이 있습니다. HQL 쿼리는 또한 Hibernate에서 공식적으로 권장하는 쿼리 방법입니다.
다음으로 사례 연구를 통해 관련 쿼리 방법을 분석합니다.
classs.java :
공개 클래스 수업 {/*클래스 ID*/개인 int ID;/*클래스 이름*/개인 문자열 이름;/*클래스와 학생 간의 관계*/private set <tudent> 학생; // setter and getter methods}학생. 자바 :
공개 클래스 학생 {/*학생 ID*/개인 int ID;/*학생 이름*/개인 문자열 이름;/*학생과 수업 간의 관계*/개인 수업 수업; // 세터와 getter 방법을 생략합니다}class.hbm.xml :
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 이름 = "클래스"테이블 = "t_classes"lazy = "false"> <id name = "id"> <generator/generator/> </id> <속성 이름 = "name"/> <!-일대일 맵핑, inverse = "true ="true "는 동료와의 관계를 넘겨주는"true "> <classid"/>>>>>>>>>>>/> <classid "" </class> </hibernate-mapping>
학생 .hbm.xml :
<? xml version = "1.0"?> <! doctype hibernate hibernate public "-// hibernate/hibernate 매핑 dtd 3.0 // 테이블 = "t_student"> <id name = "id"> <generator // id> <!-MAP 정상 속성-> <속성 이름 = "name"/> <!-다중-하나 매핑, 다중 끝에 외국 키를 추가-> <다-하나 이름 = "class"councm "classId"/> </class apping>
/*결과 세트 속성 목록, 요소 유형 및 엔티티 클래스의 속성 유형은 동일합니다*/ list <string> 학생 = 세션. /*travel*/ for (iterator <string> iter = whit보지. iterator (); iter.hasnext ();) {문자열 이름 = (string) iter.next (); System.out.println (이름); }참고 : 단일 속성을 쿼리 할 때 리턴 된 세트는 컬렉션이며 수집 요소의 유형은 속성의 유형입니다.
/*여러 속성 쿼리, 객체 배열 반환*/ list <객체 []> withys = session.createquery ( "Select Id, Name Name"). list (); /*transip*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : 여러 속성 쿼리는 유형 객체 배열 모음을 반환합니다. 이해하기 쉽습니다. 단일 속성을 쿼리하는 것이 반환 된 수집 요소 유형 일 때, 그것은 속성의 유형이지만 여러 유형은 어떻습니까? 이는 프로세스의 객체 배열, 즉 Object []이어야합니다.
/*우리는 엔티티 객체의 해당 생성자를 설정 한 다음 객체를 쿼리하여 엔티티 객체 유형 모음을 반환 할 수 있습니다. /*Travel*/ for (iterator iter = whit보지. iterator (); iter.hasnext ();) {Student Student = (Student) iter.next (); System.out.println (whening.getId () + "," + Student.GetName ()); }참고 : 두 번째 메소드 외에도 객체 배열을 반환 한 다음 엔티티 객체의 해당 생성자를 설정 한 다음 객체를 쿼리하여 개체를 쿼리 한 다음 엔티티 유형 모음을 반환 할 수 있습니다.
/*별명을 사용할 수 있습니다*/ list <object []> whitivers.createquery ( "SELECT S.ID, S.Name에서 S.Name"). list (); /*transip*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); } /*반환은 엔티티 객체 유형의 모음입니다*/ list <tudent> 학생 = session.createquery ( "학생"). list (); /*transip*/ for (iterator <tudent> iter = student.iterator (); iter.hasnext ();) {Student Student = (Student) iter.next (); System.out.println (whity.getName ()); }참고 : 쿼리 엔티티는 From 클래스 이름의 형태를 직접 사용할 수 있습니다.
/*선택을 사용하여 별명을 사용하십시오*/ list <tudent> 학생 = session.createquery ( "select s from s student s"). list (); /*transip*/ for (iterator <tudent> iter = student.iterator (); iter.hasnext ();) {Student Student = (Student) iter.next (); System.out.println (whity.getName ()); }참고 : 선택 키워드를 사용하려면 별칭을 사용해야합니다. 또 다른 요점에 주목해야합니다. HQL은 select *의 형태를 지원하지 않습니다.
/ ** * 목록을 사용하여 엔티티 객체를 쿼리하는 경우 엔티티 객체 데이터 * * hibernate : select student0_.id, id0_, name0_, * student0_.createTime을 createTime0_, student0_.cratessiD */ list (at at at at at at at at at at at at at at at at at at at at inthordent. 학생 "). list (); /*Travel*/ for (iterator <tudent> iter = student.iterator (); iter.hasnext ();) {Student Student = (Student) iter.next (); System.out.println (whity.getName ()); }참고 : .list () 메소드를 사용하여 개체를 쿼리 할 때는 하나의 명령문 만 발행됩니다. 즉, 물리적 개체 데이터를 얻는 문입니다.
/*** N+1 문제가 발생합니다. 소위 n+1은 n+1 sql 문 * * 1 : ID 목록 * hibernate를 쿼리하는 명령문 발행 * 1 : t_student student0_ * * n : id를 기준으로 n sql 문을 내기 위해 n sql 문을 발행하는 것 * hibernate : id0_0_, id0_0_ * Student0_.createTime as CreateTime0_0_, Student0_.classesId t_student Student0_ where Student0_.id =? * */ iterator <tudent> iter = session.createquery ( "학생"). iterate (); /*여행*/ while (iter.hasnext ()) {학생 학생 = (학생) iter.next (); System.out.println (whity.getName ()); }참고 : iterator ()를 통해 객체 쿼리를 수행 할 때 N+1 문이 발행됩니다. 먼저, 엔티티 오브젝트의 ID를 쿼리하기 위해 명세서가 발행되며, N 개체를 쿼리하기 위해 해당 ID를 기반으로 N 문이 발행됩니다. 공식적인 성능은 비교적 열악합니다.
/*쿼리 컬렉션을 첫 번째 수준 캐시에 저장, 즉 세션 수준 캐시*/ list <tudent> 학생 = 세션 .createquery ( "학생"). list (); /*transip*/ for (iterator <tudent> iter = student.iterator (); iter.hasnext ();) {Student Student = (Student) iter.next (); System.out.println (whity.getName ()); } System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Avoid N+1 problem* * Because after performing 목록 조작, 데이터는 세션 캐시 (1 단계 캐시)에 배치됩니다. * ID 목록을 쿼리하는 명령문이 발행되고, 해당 데이터가 캐시에 일치하는 데이터에 따라 해당 데이터가 캐시에로드됩니다. 캐시, 그렇지 않으면 n+1 문제가 발생할 수 있습니다.참고 : 실제로, Hibernate는 Iterator () 쿼리를 제공하여 성능을 향상 시키므로 왜 그렇게 많은 도움이됩니까? 그 이유는 iterator ()가 첫 번째 수준 캐시에서 데이터를 가져 오기 때문입니다. 캐시에 데이터가 있으면 효율성이 의심 할 여지없이 매우 강력합니다. 그러나 처음으로 쿼리 할 때 캐시에 어떻게 데이터가있을 수 있습니까? 이것은 소위 N+1 문제로 이어집니다. 위의 코드는 N+1 문제를 피할 수 있습니다. 아이디어는 List ()를 먼저 쿼리로 사용하는 것입니다. 목록 ()이 쿼리되고 데이터가 1 단계 캐시 요약에 존재하며 iterator ()를 사용할 때는 효율이 매우 높습니다.
/*조건에 따른 쿼리 (별칭은 일반적으로 여기에서 더 편리합니다)*/ list <object []> withys = session.createquery ( "seel seel seence s.id, s.name where s.name 'like'%0%'"). list (); /*travel*/ for (iterator <object []> iter = whitient.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : 조건부 쿼리는 기본 SQL과 동일하며 둘 다 키워드입니다. 또한 일반적으로 별칭을 사용하는 것이 더 편리합니다. 위의 프로그램은 여러 속성을 쿼리하는 것이므로 객체 배열 유형 모음을 반환하고 객체 배열의 요소는 해당 속성입니다.
/*chenged 프로그래밍*/ list <객체 []> 학생 = 세션 .createRery ( "s.id, s.name에서 s.name where s.name where?") .setparameter (0, "%0%") .list (); /*travel*/ for (iterator <object []> iter = whitient.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : 매개 변수는 자리 표시자를 통해 전달 될 수있어 SQL 주입을 방지 할 수 있습니다.
/*Chip 프로그래밍*/ list <객체 []> sevident = session.createquery ( "s.id, s.name s.name에서 s.name where s.name where : myname") .setparameter ( "myname", "%0%") .list (); /*객체 배열*/ for (iterator <object []> iter = whitod.iterator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : 마찬가지로 : MyName 콜론 후에 공간이 없으면 오류가 발생합니다.
[java] 평면 사본보기/ * IN 메소드를 채택하면 하나의 공식 매개 변수 만 사용할 수 있습니다. */ list <객체 []> withys = session.createpery ( "SELECT S.ID, S.Name S.Id in (: ids)".SetParameterList ( "IDS", 새 개체 [] {1, 2, 3, 4, 5}); /*transip*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : IN 이후 브래킷에는 하나의 공식 매개 변수 만 있습니다. 매개 변수 값을 설정하면 객체 배열을 통해 값을 전달할 수 있습니다.
/* 2009-08의 쿼리 학생들은 mySQL의 날짜 서식 기능*/ list <객체 []> 학생 = session.createRery ( "select s.id, s.name where date_format (s.createTime, '%y-%m')) .setParameter (0,"2009-08 ") .List (); /*travel*/ for (iterator <object []> iter = whitient.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); } simpledateformat sdf = new simpledateformat ( "yyyy-mm-dd hh : mm : ss"); /*2009-08-01에서 2009-08-20의 학생들은 MySQL의 날짜 서식 함수*/ list <객체 []> sevident = session.createquery ( "select s.id, s.name from s.createtime 사이의 s.createtime과?")를 호출 할 수 있습니다. sdf.parse ( "2009-08-20 23:59:59")) .list (); /*transip*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); } / * 선택 * 사용 * 원래 SQL 문을 사용해야하며 여러 속성을 쿼리하는 것과 유사하므로 객체 배열 유형 모음을 반환합니다 */ list <객체 []> session.createsqlQuery ( "select * from t_student"). list (); /*transip*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : HQL은 Select *의 쿼리 형식을 지원하지 않지만 최대 절전 모드는 원래 SQL 문을 지원합니다. SQL 문을 사용하여 쿼리 할 수 있습니다. 또한 HQL의 쿼리 다중 속성과 유사하므로 객체 배열 유형 모음을 반환합니다.
/*페이지 쿼리, setFirstresult (1)는 첫 번째 데이터에서 시작하는 것을 의미합니다. setMaxResult (2)는 페이지 당 2 개의 데이터가 표시됨을 의미합니다*/ list whity = session.createquery ( "학생") .setFirstresult (1) .setMaxResults (2) .list (); /*Travel*/ for (iterator iter = whit보지. iterator (); iter.hasnext ();) {Student Student = (Student) iter.next (); System.out.println (whity.getName ()); } /*Navigation Query, S.classes.name 학생에서 수업에서 수업으로 탐색 (이것은 더 많은 끝에서 더 적은 끝으로 탐색 할 수 있습니다)*/ list <tudent> 학생 = session.createquery ( "s.classes.name '%2%'") .list (); /*Travel*/ for (iterator <tudent> iter = student.iterator (); iter.hasnext ();) {Student Student = (Student) iter.next (); System.out.println (whity.getName ()); }참고 : 위의 쿼리 문의 S.classes.name은 학생 탐색에서 클래스 수업에 이르기까지 클래스 이름을 얻는 것입니다. 반대로 탐색 할 수도 있습니다. 특정 속성을 얻으려면 클래스에서 학생으로 탐색하십시오. 또한이 프로그램의 쿼리 명령문은 모든 학생들에게 클래스 이름의 2를 쿼리하는 것을 의미합니다.
/ *내부 연결, 가입 키워드를 사용하기 만하면 */ list <object []> withys = session.createpery ( "select c.name, s.name s.name s.classes c") .list (); /*transaction*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : 내부 연결의 키워드는 결합되며 연결은 별명 및 탐색을 사용하여 여전히 수행됩니다. 위의 쿼리 명령문은 다음을 의미합니다. 학생 테이블 및 수업 테이블에서 클래스 이름과 학생 이름을 쿼리합니다 (내부 연결은 수업이 없거나 학생이 없거나 수업없이 쿼리 할 수없는 쿼리에 가치있는 속성이 있어야 함을 의미합니다).
/*왼쪽 조인 사용 키워드 왼쪽 왼쪽 왼쪽 <개체 []> 학생 = 세션. /*transip*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : 왼쪽 조인에 사용되는 키워드는 Left Join입니다. 위의 쿼리 진술은 학생과 수업 테이블에서 클래스 이름과 학생 이름을 쿼리합니다. 왼쪽 연결이므로 수업이없는 학생들도 쿼리됩니다.
[java] 평범한 사본보기/*오른쪽 가입 키워드가 맞습니다*/ list <객체 []> whitods = session.createquery ( "select c.name, s.name wright right join s.classes c") .list (); /*transip*/ for (iterator <object []> iter = whitodator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }참고 : 올바른 조인을 사용하는 키워드는 올바른 조인입니다. 위의 쿼리 진술은 학생과 수업 테이블에서 클래스 이름과 학생 이름을 쿼리합니다. 올바른 연결이기 때문에 학생이없는 수업은 쿼리됩니다.
long count = (long) session.createquery ( "학생의 count (*) select (*)"). iriqueresult ();
참고 : *와 함께 HQL에서는 통계 쿼리 만 사용할 수 있습니다. Iliqueresult ()는 하나의 결과 세트 만 있고 반환 된 유형은 길이가 하나만 있음을 의미합니다.
/*query 문*/ String HQL = "C.Name, Count Class C C.Name Order에 의해 C.Name Order에 의해 C.Name S Group에 가입하여 C.Name을 선택하십시오."; List <Object []> whitsing = session.createquery (HQL) .list (); /*Travel*/ for (int i = 0; i <withle.size (); i ++) {object [] obj = (Object []) whitsing.get (i); System.out.println (obj [0] + "," + obj [1]); }참고 : HQL은 그룹화, 정렬 등을 지원합니다. 위의 진술은 다음을 의미합니다. 각 수업의 이름을 쿼리하고 각 클래스의 학생 수, 클래스 이름 별 그룹, 클래스 이름별로 정렬
위의 내용은이 기사의 최대 절전 모드 HQL 쿼리 코드 예제에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!