Hibernate 에서 createCriteria 즉 QBC 조회 의 상세 한 용법

현재 Student 클래스 가 있다 고 가정 하면 id, name, age 속성 String hql = "from Student s" 가 있 습 니 다.예전 의 방법 에 따 르 면 우 리 는 보통 Query query = session. createQuery (hql) 입 니 다.또는 조건 에 따라 검색 하려 면 String hql = "from Student s where s. name like '왕%' Query query = session. createQuery (hql);HQL 을 사용 하지 않 고 QBC 를 사용 하면 코드 는: Criteria criteria = session. createCriteria (Student. class) 입 니 다.Criterion criterion = Expression. like ("name", "King%");이렇게 해서 도 알 아 볼 수 없다. 그러면 우 리 는 검색 조건 에 나 이 를 22 로 더 하 자. HQL: String hql = "from Student s where s. name like '왕%' and s. age = 22";Query query = session.createQuery(hql); List list = query.list(); QBC: Criteria criteria =session.createCriteria(Student.class); Criterion criterion 1 = Expression. like ("name", "King%");Criterion criterion2 = Expression.eq("age",newInteger(22)); criteria.add(criterion1).add(criterion2); List list = criteria.list(); 번 거 로 워 보 입 니 다. 하지만 프로젝트 를 해 본 사람들 은 모두 알 고 있 습 니 다. 한 모듈 의 업무 논리 가 바 뀌 었 을 때 sql 을 다시 써 야 합 니 다. 가장 귀 찮 고 가장 싫어 하 는 것 은 다른 사람의 hql 이나 sql 을 들 고 두 눈 을 부 릅 뜨 고 산책 하 는 것 입 니 다. 도대체 무엇 을 수정 해 야 합 니까?QBC 를 사용 하면 코드 의 가 독성 과 유지 가능성 이 크게 증가 합 니 다. 예 를 들 어 null 값 을 찾 으 려 면 Criteria criteria = session. create Criteria (Student. class) 를 이렇게 써 야 합 니 다.Criterion criterion = Expression.isNull("name"); criteria.add(criterion).list(); 그리고 between... and 를 사용 할 때 Criteria criteria = session. createCriteria (Student. class);Criterion criterion1 = Expression.ge("age",new Integer(20));//하한 기준 기준 2 = Expression. le ("age", new Integer (25)); / /상한 / / 여기 서도 상기 두 가지 조건 을 세 번 째 조건 에 추가 할 수 있 습 니 다. Criterion criterion 3 = Expression. and (criterion 1, criterion 2);criteria.add(criterion3).list(); from Student s where s. age between 20 and 25 는 from Student s where s. age > = 20 and s. age < = 25 와 같 습 니 다.                  HQL                   QBC 는 같 음 보다 크다                    >=                    Expression. ge () 이상                        >                     Expression. lt () 보다 작 음                    <=                    Expression. le () 이하                        <                     Expression. lt () 는                        =                     Expression. eq () 는 같 지 않 습 니 다.                      <>아니면!             Expression.ne() 
텅 비다                        is null               Expression. isNull () 이 비어 있 지 않 음                      is notnull            Expression. is NotNull () 지정 한 범위 내 에서                betweenand            Expression. between () 은 지정 한 범위 에 있 지 않 습 니 다.                not betweenand        Expression. not (Expression. between () 는 집합 에 속 합 니 다.                in                    Expression. in () 은 집합 에 속 하지 않 습 니 다.              notin                 Expression. not (Expression. in () 과                         and                   Expression. and () 또는                         or                    Expression. or () 비                         not                   Expression. not () 모호 조회                   like                  Expression.like
1. Criteria 인 스 턴 스 net. sf. hibenate. Criteria 인 터 페 이 스 를 만 드 는 것 은 특정한 지구 화 류 에 대한 조 회 를 대표 합 니 다.세 션 은 Criteria 인 스 턴 스 를 만 드 는 공장 입 니 다.
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. 결과 집합 범 위 를 축소 하 는 조회 조건 (Criterion) 은 net. sf. hibenate. expression. Criterion 인터페이스의 인 스 턴 스 입 니 다.클래스 net. sf. hibenate. expression. Expression 은 내 장 된 Criterion 형식 을 정의 합 니 다.
List cats = sess.createCriteria(Cat.class)
                .add( Expression.like("name", "Fritz%") )
                .add( Expression.between("weight", minWeight, maxWeight))
                .list(); 
표현 식 (Expressions) 은 논리 적 으로 그룹 을 나 눌 수 있 습 니 다.
 List cats = sess.createCriteria(Cat.class)
                .add( Expression.like("name", "Fritz%") )
                .add( Expression.or( Expression.eq( "age", new Integer(0) ), Expression.isNull("age")))
                .list();
List cats = sess.createCriteria(Cat.class)
                .add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
                .add( Expression.disjunction()
                .add( Expression.isNull("age") )
                .add( Expression.eq("age", new Integer(0) ) )
                .add( Expression.eq("age", new Integer(1) ) )
                .add( Expression.eq("age", new Integer(2) ) ) ) )
                 .list(); 
미리 제 작 된 조건 유형 이 많 습 니 다 (Expression 의 하위 클래스).SQL 에 직접 삽입 할 수 있 는 아주 유용 한 것 이 있 습 니 다.
List cats = sess.createCriteria(Cat.class) 
                .add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
                .list();  
{alias} 은 검색 한 실체의 줄 별명 으로 대 체 됩 니 다.(원문: {alias} 위치 지정자 가 쿼 리 된 엔 터 티 의 행 별칭 으로 대 체 됩 니 다.)
3. 결과 정렬 은 net. sf. hibenate. expression. Order 를 사용 하여 결과 집합 을 정렬 할 수 있 습 니 다.
List cats = sess.createCriteria(Cat.class)
                .add( Expression.like("name", "F%")
                .addOrder( Order.asc("name"))
                .addOrder( Order.desc("age"))
                .setMaxResults(50)
                .list();
4. 관련 (Associations) 은 관련 사이 에 createCriteria () 를 사용 하여 관계 가 있 는 실체 간 에 제약 을 쉽게 지정 할 수 있 습 니 다.
List cats = sess.createCriteria(Cat.class)
                 .add( Expression.like("name", "F%")
                 .createCriteria("kittens")
                 .add( Expression.like("name","F%")
                 .list();
두 번 째 createCriteria () 는 criteria 의 새로운 인 스 턴 스 를 되 돌려 kittens 집합 류 의 요 소 를 가리 키 고 있 습 니 다. 아래 의 대체 형식 은 특정 상황 에서 유용 합 니 다.
List cats = sess.createCriteria(Cat.class)
                .createAlias("kittens", "kt")
                .createAlias("mate", "mt")
                .add(Expression.eqProperty("kt.name", "mt.name"))
                .list();
(createAlias ()) 는 Criteria 의 새로운 인 스 턴 스 를 만 들 지 않 습 니 다.) 앞의 두 검색 에서 Cat 인 스 턴 스 가 가지 고 있 는 kittens 집합 류 는 criteria 를 통 해 미리 걸 러 지지 않 았 습 니 다. 조건 에 맞 는 kittens 만 되 돌아 가 려 면 returnMaps () 를 사용 해 야 합 니 다.
List cats = sess.createCriteria(Cat.class)
 .createCriteria("kittens", "kt")
 .add( Expression.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. 동적 관련 대상 가 져 오기 (Dynamic association fetching) 는 실행 할 때 setFetchMode () 를 통 해 관련 대상 이 자동 으로 가 져 오 는 정책 을 변경 할 수 있 습 니 다.
List cats = sess.createCriteria(Cat.class)
                .add( Expression.like("name", "Fritz%") )
                .setFetchMode("mate", FetchMode.EAGER)
                .list();
이 조 회 는 외부 연결 (outer join) 을 통 해 mate 와 kittens 를 동시에 얻 을 수 있 습 니 다. 
6. 예제 조회 (Example query) net. sf. hibenate. expression. Example 류 에 따라 지정 한 인 스 턴 스 에서 조회 조건 을 만 들 수 있 습 니 다.
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class) 
                    .add( Example.create(cat) ) 
                    .list(); 
버 전 속성 은 문자 속성 과 관련 성 을 무시 합 니 다. 기본적으로 null 값 의 속성 도 제 외 됩 니 다. You can adjust how the Example is applied.
예제 (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(); 
관련 대상 에 대해 예제 로 criteria 를 만 들 수도 있 습 니 다. List results = session. createCriteria (Cat. class). add (Example. create (cat))
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
참조 코드 는 다음 과 같 습 니 다.
String[] aa = new String[2];


List results = getSession().createCriteria(
		"base.database.entity.Menu")
		.add(Example.create(instance))
		.add(Restrictions.between("date",new Date(),new Date()))
		.add(Restrictions.or(Expression.eq("flg", "S"), Expression.eq("FLG", "D")))
		.add(Restrictions.in("flg", aa))
		.addOrder(Order.asc("menuOrder"))
		.list();


add(Projections.groupProperty("color"))

좋은 웹페이지 즐겨찾기