Criteria 와 Detached 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();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1)Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.