SQL 문에 익숙하지 않은 미국 프로그래머에게는 쉬운 기준 쿼리에 대해 이야기 해 봅시다.
더 이상 고민하지 않고 예를 살펴 보겠습니다.
엔티티 클래스는 다음과 같습니다.
공개 클래스 사용자는 직렬화 가능 {private static final long serialversionuid = 1L; 공개 긴 ID; 개인 문자열 이름; 사적인 int 연령; // GET/SET Method를 생략} 우리는 매핑 파일을 작성하지 않을 것입니다. 매우 간단한 엔티티입니다. 어린이 신발을 이해하지 못하면 최대 절전 모드 카테고리의 다른 기사를 참조하십시오.
다음으로 쿼리에 기준을 사용하는 방법을 살펴 보겠습니다.
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = CFG.BuildSessionFactory (); 세션 세션 = sessionfactory.opensession (); 기준 기준 = session.createCriteria (user.class); criteria.add (제한 .eq ( "name", "shun")); 목록 = criteria.list (); 반복자 iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } 코드를 보면 매우 간단한 문자열입니다.
우리는 모두 이전의 것들에 익숙하며 세션을 구성한 후 코드를 봅니다.
기준 기준 = session.createCriteria (user.class); criteria.add (제한 .eq ( "name", "shun"));
이 두 코드 문장이 핵심 요점입니다. 정확히 무엇을 의미하는지 분석합시다.
첫 번째 문장에서, 우리는 세션을 통해 기준 구현 클래스의 객체를 얻고, 두 번째 문장에서는 추가 방법을 통해 조건을 추가하고 EQ는 평등을 나타냅니다. Hibernate3은 이전에 Expression.eq를 통해 구현되었습니다. 3 이후, 기준이 포기되었으므로 제한 클래스를 사용하여 표현과 동일합니다. API를 살펴보고 그 표현이 제한에서 물려받습니다.
위의 두 문장으로 돌아가서, 우리 가이 작업을 완료 한 후, Hibernate는 실제로 비슷한 구성을 도왔습니다.
사용자 중에서 * 이름 = 'shun'을 선택하십시오.
그러한 진술. (여기서, 매핑 파일의 사용자 클래스에 해당하는 테이블은 사용자 테이블이며 이름 속성은 이름 필드에 해당합니다)
제한 사항에는 SQL 문을 구축하는 데 도움이되는 많은 방법이 있습니다. API를 확인한 후 이해하기 쉽습니다.
위의 코드를 다시 살펴 보겠습니다. 세션을 닫지만이 기준을 계속 사용하고 싶다면 괜찮습니까? 봅시다.
위의 코드 후에는 다시 전환하여 다음을 추가합니다.
List2 = criteria.list (); 반복자 iter2 = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } 이전 목록과 ITER의 차이를 구별하기 위해 여기에서 다른 목록을 사용합니다.
실행하면 예외가됩니다.
org.hibernate.sessionException : 세션이 닫혔습니다!
이 예외를보고한다는 것은 세션이 종료되었음을 의미합니다. 대부분의 경우 세션을 마친 후 SaveorupDate, Save 등과 관련된 작업을 수행 한 후 유사한 예외를보고합니다.
Hibernate3은 우리의 요구를 고려하고 분리 기업을 구현하며, 이는 세션과 독립적으로 존재할 수 있습니다.
예를 살펴 보겠습니다. (엔티티는 여전히 위에 있습니다)
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = CFG.BuildSessionFactory (); 세션 세션 = sessionfactory.opensession (); DetachedCriteria 감소 = DetachedCriteria.forclass (user.class); lecriteria.add (제한 .eq ( "이름", "shun")); 목록 목록 = lecriteria.getexecutableCriteria (session) .list (); 반복자 iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); 세션 세션 2 = sessionfactory.opensession (); 목록 List2 = dexiteria.getexecutableCriteria (session2) .list (); 반복자 ITER2 = list2.ITERATOR (); while (iter2.hasnext ()) {user user = (user) iter2.next (); System.out.println (user.getName ()+":"+user.getage ()); }} 세션이 닫힌 후 다른 연결에서 분리 기업을 계속 사용할 수 있음을 알 수 있습니다. GetExecutableCriteria (세션 세션)를 통해 현재 분리 기업을 특정 세션과 연관시켜야합니다.
다음으로, 하위 쿼리 클래스와 분리 기업의 조합을 살펴 보겠습니다.
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = CFG.BuildSessionFactory (); 세션 세션 = sessionfactory.opensession (); DetachedCriteria 감소 = DetachedCriteria.forclass (user.class); lecriteria.setProjection (projections.avg ( "age")); 기준 기준 = session.createCriteria (user.class); criteria.add (subqueries.propertygt ( "age", leditria)); 목록 = criteria.list (); 반복자 iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } 질문이있는 첫 번째 코드 문장을 생각합니다.
lecriteria.setProjection (projections.avg ( "age"));
이 코드는 감소를 통해 연령의 평균 값을 얻는 것을 의미합니다. 그런 다음 나이가 아래의 평균 값보다 큰 물체를 얻으십시오.
예측에는 SQL 방법을 구현하는 많은 캡슐화 방법이 포함되어 있습니다. API를 볼 수 있습니다.
약간 더 진보 된 사용법에 대해 알아 보겠습니다.
코드를보십시오.
CRITERIA.SETFIRSTRESULT (10); Criteria.SetMaxResults (20);
여기서 우리는 시작 기록을 제 10 조로 설정 한 다음 제 10 조에서 20 개의 기록을 찾습니다.이 관행에 따르면 기본 페이징 기능을 구현할 수 있습니다.
물론, 우리는 많은 경우에 정렬해야하며 기준도 다음을 뒷받침합니다.
Criteria.addorder (Order.desc ( "Age"));
여기서 AddOrder 메소드를 직접 사용하고 atrpection 매개 변수가 필요한 order.desc를 통해 주문 객체를 얻을 수 있습니다. 실제로, 우리가 AddOrder를 호출 할 때, Hibernate는 그러한 진술, 나이에 따라 질서를 생성하는 데 도움이 될 것입니다.
우리가 그룹화해야 할 때 어떻게해야합니까? 이를 위해서는 지난번에 언급 한 프로젝션 클래스의 GroupProperty 방법이 필요합니다.
criteria.setProeject (projections.groupProperty ( "age"));
여기서 우리는 나이 속성에 따라 그룹화되며, 실제로 나이에 해당하는 현장 연령을 통해 그룹화됩니다. Hibernate는 자동으로이를 그룹과 같은 명세서로 전환합니다.
예측에는 실용적인 방법이 많이 있습니다 (이것은 최대 절전 모드 3 이후에만 사용할 수 있음).