Criteria 와 Detached Criteria 의 차이 점 과 사용

14166 단어 HibernateCriteria
Criteria 와 Detached Criteria 의 주요 차이 점 은 생 성 형식 이 다 르 고 Criteria 는 온라인 입 니 다.
Hibernate Session 에서 만 들 었 습 니 다.Detached Criteria 는 오프라인 입 니 다. 만 들 때 필요 없습니다.
Session, Detached Criteria 는 2 개의 정적 방법 forClass (Class) 또는 forEntity Name (Name) 을 제공 합 니 다.
Detached Criteria 인 스 턴 스 생 성 을 진행 합 니 다.Spring 의 프레임 워 크 는 getHibernateTemplate 를 제공 합 니 다.
(). findByCriteria (detached Criteria) 방법 은 Detached Criteria 에 따라 조회 결 을 편리 하 게 되 돌려 줄 수 있다.
과일
Criteria 와 Detached Criteria 는 모두 Criterion 과 Projection 을 사용 하여 조회 조건 을 설정 할 수 있 습 니 다.설치 할 수 있다
FetchMode (공동 검색 캡 처 모드) 를 설정 하고 정렬 방식 을 설정 합 니 다.Criteria 에 대해 서 는 Flushmodel 도 설정 할 수 있 습 니 다.
(Session 을 씻 는 방식) 과 LockMode (데이터베이스 잠 금 모드).
다음은 Criterion 과 Projection 에 대한 상세 한 설명 입 니 다.
Criterion 은 Criteria 의 조회 조건 입 니 다.Criteria 는 add (Criterion criterion) 방법 을 제공 합 니 다.
조회 조건 추가.
Criterion 인터페이스의 주요 실현 은 Example, Junction, Simple Expression 을 포함한다.그리고
Junction 의 실제 사용 은 두 개의 하위 클래스 인 conjunction 과 disjunction 으로 각각 AND 와 OR 체 조 를 사용한다.
부 호 를 만들어 조회 조건 집합 을 연결 하 다.
Criterion 의 인 스 턴 스 는 Restrictions 도구 류 를 통 해 만 들 수 있 습 니 다. Restrictions 는 대량의 정적 을 제공 합 니 다.
방법, 예 를 들 어 eq (같 음), ge (같 음 이상), between 등 방법 으로 Criterion 조회 조건 을 만 듭 니 다.
(Simple Expression 인 스 턴 스).이외에 도 Restrictions 는 conjunction 과
disjunction 인 스 턴 스, 이 인 스 턴 스 의 add (Criteria) 방법 으로 조회 조건 을 추가 하여 조회 조건 집합 을 만 듭 니 다.

Example 생 성 이 다 르 기 때문에 Example 자체 가 정적 방법 create (Object) 를 제공 합 니 다.
enity), 즉 하나의 대상 (실제 사용 중 데이터베이스 에 비 친 대상) 에 따라 만 듭 니 다.그리고 설정 할 수 있어 요.
필터 조건:
Example exampleUser =Example.create(u)
. ignoreCase () / 대소 문자 무시
.enableLike(MatchMode.ANYWHERE);
/ / String 형식의 속성 은 그 값 이 어디 에 있 든 일치 합 니 다.% value% 에 해당 함
Project 는 주로 Criteria 가 보고서 조 회 를 할 수 있 도록 하고 그룹 을 나 눌 수 있 도록 한다.프로젝트
Simple Projection, Projection List, Property 세 가지 실현.그 중에서 Simple Projection 과...
ProjectionList 의 실례 화 는 제 공 된 avg, count, max,
min, sum 은 개발 자가 특정한 필드 에 대해 통계 조 회 를 쉽게 할 수 있 도록 합 니 다.
       Property 는 Porperty. forName ("color"). in 과 같은 필드 에 대한 조회 조건 을 설정 합 니 다.
(new String[]{“black”,”red”,”write”}); Project 인 스 턴 스 를 만 들 수 있 습 니 다.통과 하 다.
criteria 의 add (Project) 방법 은 조회 조건 에 가입 합 니 다.
    Criteria 를 이용 하여 조 회 를 진행 하 는데, 주로 하 이 버 네 이 트 가 개발 중의 조 사 를 만족 시 키 기 위해 그러한 종류 와 방법 을 제공 했다 는 것 을 명확 하 게 해 야 한다.
문의 조건 의 생 성과 조립, 다음은 몇 가지 용법 을 소개 합 니 다.
1. Criteria 인 스 턴 스 만 들 기
org. hibenate. criteria 인 터 페 이 스 는 특정 지구 류 의 조 회 를 표시 합 니 다.세 션 은 크 리 테 리 아 실례 공장 입 니 다.
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. 결과 집 내용 제한
하나의 단독 조회 조건 은 org. hibenate. criterion. criterion 인터페이스의 인 스 턴 스 입 니 다.
org. hibenate. criterion. Restrictions 류 는 내 장 된 Criterion 유형의 공장 방법 을 정의 합 니 다.
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();
제약 은 논리 에 따라 그룹 을 나 눌 수 있다.

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.or(
        Restrictions.eq( "age", new Integer(0) ),
        Restrictions.isNull("age")
    ) )
    .list();

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
    .add( Restrictions.disjunction()
        .add( Restrictions.isNull("age") )
        .add( Restrictions.eq("age", new Integer(0) ) )
        .add( Restrictions.eq("age", new Integer(1) ) )
        .add( Restrictions.eq("age", new Integer(2) ) )
    ) )
    .list();

Hibernate 는 상당히 많은 내 장 된 criterion 형식 (Restrictions 하위 클래스) 을 제공 하지만, 특히 SQL 을 직접 사용 할 수 있 도록 해 준다.

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",Hibernate.STRING) )
    .list();

{alias} 자리 표시 자 는 검색 대상 의 열 별명 으로 바 뀌 어야 합 니 다.
Property 인 스 턴 스 는 하나의 조건 을 얻 는 또 다른 경로 이다.Property. forName () 을 호출 하여 Property 를 만 들 수 있 습 니 다.

Property age = Property.forName("age");
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.disjunction()
        .add( age.isNull() )
        .add( age.eq( new Integer(0) ) )
        .add( age.eq( new Integer(1) ) )
        .add( age.eq( new Integer(2) ) )
    ) )
    .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
    .list();

3. 결과 집합 정렬
검색 결 과 를 정렬 하기 위해 org. hibenate. criterion. Order 를 사용 할 수 있 습 니 다.

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "F%")
    .addOrder( Order.asc("name") )
    .addOrder( Order.desc("age") )
    .setMaxResults(50)
    .list();

List cats = sess.createCriteria(Cat.class)
    .add( Property.forName("name").like("F%") )
    .addOrder( Property.forName("name").asc() )
    .addOrder( Property.forName("age").desc() )
    .setMaxResults(50)
    .list();

4. 관련
createCriteria () 를 사용 하여 서로 연 결 된 실체 간 에 제약 을 쉽게 만 들 수 있 습 니 다.

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "F%")
    .createCriteria("kittens")
        .add( Restrictions.like("name", "F%")
    .list();

두 번 째 createCriteria () 는 새로운 Criteria 인 스 턴 스 를 되 돌려 줍 니 다. 이 인 스 턴 스 는 kittens 집합 에 있 는 요 소 를 참조 합 니 다.다음은 형태 교체 도 어떤 경우 에 유용 하 다.

List cats = sess.createCriteria(Cat.class)
    .createAlias("kittens", "kt")
    .createAlias("mate", "mt")
    .add( Restrictions.eqProperty("kt.name", "mt.name") )
    .list();

(createAlias () 는 새로운 Criteria 인 스 턴 스 를 만 들 지 않 습 니 다.)
Cat 인 스 턴 스 가 저장 하기 전에 두 번 의 조회 에서 돌아 온 kittens 집합 은 조건 에 따라 미리 걸 러 지지 않 았 습 니 다.조건 에 맞 는 kittens 만 얻 으 려 면 returnMaps () 를 사용 해 야 합 니 다.

List cats = sess.createCriteria(Cat.class)
    .createCriteria("kittens", "kt")
    .add( Restrictions.eq("name", "F%") )
    .returnMaps()
    .list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
    Map map = (Map) iter.next();
    Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
    Cat kitten = (Cat) map.get("kt");
}

5. 동적 연결 캡 처
setFetchMode () 를 사용 하여 실행 할 때 동적 관련 캡 처 의 의 미 를 정의 할 수 있 습 니 다.

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .setFetchMode("mate", FetchMode.EAGER)
    .setFetchMode("kittens", FetchMode.EAGER)
    .list();

이 조 회 는 외부 연결 을 통 해 mate 와 kittens 를 캡 처 할 수 있 습 니 다.
6. 조회 예시
org. hibenate. criterion. Example 류 는 주어진 인 스 턴 스 를 통 해 조건 조 회 를 구축 할 수 있 습 니 다.

Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .list();

버 전 속성, 식별 자, 관련 이 무시 되 었 습 니 다.기본적으로 값 이 null 인 속성 은 제 외 됩 니 다.스스로 Example 을 조정 하여 더욱 실 용적 으로 만 들 수 있 습 니 다.

Example example = Example.create(cat)
    .excludeZeroes()           //exclude zero valued properties
    .excludeProperty("color") //exclude the property named "color"
    .ignoreCase()              //perform case insensitive string comparisons
    .enableLike();             //use like for string comparisons
List results = session.createCriteria(Cat.class)
    .add(example)
    .list();

심지어 examples 를 사용 하여 관련 대상 에 조건 을 배치 할 수 있 습 니 다.

List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .createCriteria("mate")
        .add( Example.create( cat.getMate() ) )
    .list();

7. 투영 (Projections), 집합 (aggregation), 그룹 (grouping) org. hibenate. criterion. Projections 는 Projection 의 인 스 턴 스 공장 입 니 다.우 리 는 setProjection () 을 호출 하여 검색 에 투영 합 니 다.

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.rowCount() )
    .add( Restrictions.eq("color", Color.BLACK) )
    .list();

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount() )
        .add( Projections.avg("weight") )
        .add( Projections.max("weight") )
        .add( Projections.groupProperty("color") )
    )
    .list();

조건 조회 에서 'group by' 를 명시 적 으로 사용 할 필요 가 없습니다.일부 투영 유형 은 그룹 투영 으로 정의 되 고 SQL 의 group by 자구 에 도 나타 납 니 다.투영 값 을 제약 하거나 정렬 할 수 있 도록 별명 을 투영 에 할당 할 수 있 습 니 다.다음은 두 가지 서로 다른 실현 방식 이다.

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
    .addOrder( Order.asc("colr") )
    .list();

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.groupProperty("color").as("colr") )
    .addOrder( Order.asc("colr") )
    .list();

alias () 와 as () 방법 은 다른 별명 인 Projection 인 스 턴 스 에 투영 인 스 턴 스 를 간편 하 게 포장 합 니 다.쉽게 말 하면 투영 목록 에 투영 을 추가 할 때 별명 을 지정 할 수 있 습 니 다.

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount(), "catCountByColor" )
        .add( Projections.avg("weight"), "avgWeight" )
        .add( Projections.max("weight"), "maxWeight" )
        .add( Projections.groupProperty("color"), "color" )
    )
    .addOrder( Order.desc("catCountByColor") )
    .addOrder( Order.desc("avgWeight") )
    .list();

List results = session.createCriteria(Domestic.class, "cat")
    .createAlias("kittens", "kit")
    .setProjection( Projections.projectionList()
        .add( Projections.property("cat.name"), "catName" )
        .add( Projections.property("kit.name"), "kitName" )
    )
    .addOrder( Order.asc("catName") )
    .addOrder( Order.asc("kitName") )
    .list();

Property. forName () 을 사용 하여 투영 을 표시 할 수도 있 습 니 다.

List results = session.createCriteria(Cat.class)
    .setProjection( Property.forName("name") )
    .add( Property.forName("color").eq(Color.BLACK) )
    .list();
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount().as("catCountByColor") )
        .add( Property.forName("weight").avg().as("avgWeight") )
        .add( Property.forName("weight").max().as("maxWeight") )
        .add( Property.forName("color").group().as("color" )
    )
    .addOrder( Order.desc("catCountByColor") )
    .addOrder( Order.desc("avgWeight") )
    .list();

8. 오프라인 (detached) 조회 와 하위 조회
Detached Criteria 클래스 는 session 범위 밖에서 검색 어 를 만 들 고 임의의 Session 을 사용 하여 실행 할 수 있 습 니 다.

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
    .add( Property.forName("sex").eq('F') );
//    Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();

Detached Criteria 도 하위 조 회 를 표시 하 는 데 사용 할 수 있다.조건 인 스 턴 스 는 하위 조 회 를 포함 하여 Subqueries 나 Property 를 통 해 얻 을 수 있 습 니 다.

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
    .add( Property.forName("weight).gt(avgWeight) )
    .list();
DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
    .add( Subqueries.geAll("weight", weights) )
    .list();

서로 연 결 된 하위 조회 도 가능 합 니 다.

DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
    .setProjection( Property.forName("weight").avg() )
    .add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
    .add( Property.forName("weight).gt(avgWeightForSex) )
    .list();

  

좋은 웹페이지 즐겨찾기