|
|
게시됨 2017. 8. 9. 오후 2:26:13
|
|
|

이제 id, name, age 속성을 가진 Student 클래스가 있다고 가정해 봅시다 문자열 hql = "학생 s로부터"; 예전처럼, 보통 그렇게 하죠 Query query = session.createQuery(hql); 또는 조건에 따라 검색할 수도 있습니다. 문자열 hql = "학생 s에서 'King%'와 같은 s.name" Query query = session.createQuery(hql); 만약 HQL 대신 QBC를 사용한다면, 코드는 다음과 같습니다: 기준 기준 =session.createCriteria(Student.class); 기준 기준 = Expression.like("이름", "king%"); 이렇게 볼 수 없어. 그 다음 22세 연령에 검색 조건을 추가합니다.
HQL: 문자열 hql = "학생 s에서 '왕%'와 s.name 나이=22 "; Query query = session.createQuery(hql); 리스트 리스트 = query.list();
QBC: 기준 기준 =session.createCriteria(Student.class); 기준 criterion1 = Expression.like("이름","king%"); 기준 criterion2 = Expression.eq("age", newInteger(22)); 기준.add(기준1).add(기준2); 리스트 리스트 = criteria.list();
훨씬 더 번거로워 보입니다. 하지만 프로젝트를 해본 사람이라면 모듈의 비즈니스 로직이 바뀌면 종종 SQL을 다시 작성해야 한다는 것을 알고 있습니다. 그리고 가장 짜증나는 것은 다른 사람의 HQL이나 SQL을 가져가는 것입니다. QBC를 사용하면 코드의 가독성과 유지보수성이 크게 향상됩니다. null 값은 다음 값임을 유의하는 것이 중요합니다. 예를 들어, null name을 가진 Student 객체를 찾고 싶을 때는 이렇게 작성해야 합니다 기준 기준 =session.createCriteria(Student.class); Criterion criterion = Expression.isNull("name"); criteria.add(criterion).list(); 그리고 그 사이에... 그리고 시간 기준 기준 =session.createCriteria(Student.class); 기준 criterion1 = Expression.ge("나이", 새로운 정수(20)); 하한선 기준 criterion2 = Expression.le("age", new Integer(25)); 천장
//这里也可以把上述两个条件添加到第三个条件里 기준 criterion3 =Expression.and(criterion1,criterion2); criteria.add(criterion3).list(); 20세에서 25세 사이의 학생과 동등합니다. 이는 s.age >= 20, s.age <=25
다음은 HQL과 QBC의 일반적으로 사용되는 쿼리 조건 비교입니다 HQL QBC를 의미하는 표현 > 이상일 때 = Expression.ge() > Expression.gt() 이상입니다 < 미만 = Expression.le() < Expression.lt() 미만입니다 equals = Expression.eq() 는 <>or!= Expression.ne()와 같지 않습니다.
Null은 null입니다. Expression.isNull() is notnull Expression.isNotNull() 지정된 범위 내에서 ween과 Expression.between() 지정된 범위 내에서는 아니고, Expression.not(Expression.between()) Expression.in() 소장품 소속 Expression.not(Expression.in()) 컬렉션에 속하지 않음 그리고 expression.and() 또는 Expression.or() 표현이 아닙니다.not() Expression.like 같은 퍼지 쿼리
1. net.sf.hibernate.Criteria Criteria 인스턴스 생성 이 인터페이스는 특정 영구 클래스에 대한 쿼리를 나타냅니다. 세션은 Criteria 인스턴스를 제조하는 데 사용되는 공장입니다.
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. 결과 집합의 범위를 좁히기 쿼리 조건(Criterion)은 net.sf.hibernate.expression.Criterion 인터페이스의 인스턴스입니다. net.sf.hibernate.expression.Expression 클래스는 내장된 Criterion 타입을 얻기 위해 정의합니다.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("이름", "Fritz%")
.add( Expression.between("weight", minWeight, maxWeight))
.list(); 표현식은 논리적으로 그룹화할 수 있습니다.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("이름", "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", 새 Integer(0) )
.add( Expression.eq("age", 새로운 Integer(1) )
.add( Expression.eq("age", 새로운 Integer(2) ) ) )
.list(); 미리 만들어진 조건 유형(표현식의 하위 클래스)이 많이 있습니다. SQL을 직접 삽입할 수 있게 해주는 유용한 기술이 있습니다.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); {alias}가 자리 표시자인 경우, 쿼리된 엔터티의 줄 별칭으로 대체됩니다. (원래: {alias} 자리 표시자를 쿼리된 엔터티의 행 별칭으로 대체합니다.)
3. 결과 정렬하기 결과 집합을 정렬하기 net.sf.hibernate.expression.Order를 사용할 수 있습니다.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("이름", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. 연관성 관계 관계 사이에 createCriteria()를 사용하여 관계가 있는 엔티티 간의 제약 조건을 쉽게 지정할 수 있습니다.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("이름", "F%")
.createCriteria("kittens")
.add( Expression.like("name","F%")
.list();
두 번째 createCriteria()는 새끼 고양이 컬렉션 클래스의 요소를 가리키는 새로운 Criteria 인스턴스를 반환한다는 점에 유의하세요. 다음과 같은 대체 형태는 특정 상황에서 유용합니다.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias())는 Criteria의 새로운 인스턴스를 생성하지 않습니다. 앞선 두 쿼리에서 Cat 인스턴스가 보유한 새끼 고양이 컬렉션 클래스는 기준에 의해 사전 필터링되지 않았다는 점에 유의하세요! 기준에 맞는 새끼 고양이만 반환하고 싶다면 returnMaps()를 사용해야 합니다.
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("이름", "F%")
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext())
{
맵 맵 = (맵) iter.next();
고양이 고양이 = (고양이) 지도.get(Criteria.ROOT_ALIAS);
고양이 새끼 고양이 = (고양이) map.get("kt");
}
5. 동적 연관 가져오기 런타임에 FetchMode()를 설정하여 연관 객체의 자동 가져오기 정책을 변경할 수 있습니다.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("이름", "Fritz%")
.setFetchMode("mate", FetchMode.EAGER)
.list();
이 쿼리는 외부 조인을 통해 짝과 새끼 고양이 모두를 얻을 수 있습니다.
6. 예시 쿼리 net.sf.hibernate.expression.Example 클래스에 따르면, 지정된 인스턴스에서 쿼리 조건을 생성할 수 있습니다.
고양이 고양이 = 새 고양이();
cat.setSex('F');
cat.setColor(Color.BLACK);
목록 결과 = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); 버전 속성, 표현 속성, 연관성은 모두 무시됩니다. 기본적으로 null 속성도 제외됩니다. 예제 적용 방식을 조정할 수 있습니다. 당신은 할 수 있어요 예시가 어떻게 적용되는지 조정하기 위해서입니다. 예시 예시 = Example.create(cat) .excludeZeroes() //exclude zero valued properties
.excludeProperty("color") //"color"라는 속성은 제외합니다. .ignoreCase() //대소문자에 구분이 없는 문자열 비교 수행
.enableLike(); 문자열 비교에 유사한 사용법
목록 결과 = session.createCriteria(Cat.class)
.add(예시)
.list(); 예를 들어 관련 객체의 기준을 정하는 데도 도움이 됩니다. List results = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(예시.create(cat.getMate())) .list();
참조 코드는 다음과 같습니다:
|
이전의:LINQ 좌측, 우측, 내부 연결다음:js에서 let과 var 정의 변수의 차이점
|