2014-01-24 6 views
0

Java Persistence Query Language 위에 JPA criteria 빌더를 사용하는 이점을 알고 있습니다.JPA 기준 빌더 - 사람이 읽을 수있는 언어로

이러한 종류의 쿼리를 작성하는 방법을 쉽게 설명 할 수 있습니까? 내 검색어를 작성하는 데 사람이 읽을 수있는 설명이 필요합니다. 내 데이터베이스를 쿼리하는 직관적 인 접근 방법이 있습니다..

예 :

SQL : 메타 모델에

SELECT id,status,created_at from transactions where status='1' 
and currency='USD' and appId='123' order by id 

Critera 빌더 :

Map<SingularAttribute<Transaction, ?>, Object> params = ...; 
CriteriaBuilder cb = em.getCriteriaBuilder();   
CriteriaQuery<Tuple> cq = cb.createTupleQuery();  
Root<Transaction> r = cq.from(Transaction.class); 

Predicate p= cb.conjunction(); 
for (Map.Entry<SingularAttribute<Transaction, ?>, Object> param: params.entrySet()) 
    p = cb.and(p, cb.equal(r.get(param.getKey()), param.getValue())); 

cq.multiselect(r.get(Transaction_.id), r.get(Transaction_.status), 
      r.get(Transaction_.created_at)) 
    .where(p) 
    .orderBy(cb.asc(r.get(Transaction_.id))); 

List<Tuple> result = em.createQuery(cq).getResultList(); 

이 예제는 또 다른 질문을 기반으로했습니다 : Complex queries with JPA criteria builder

+1

직관적 인 것은 분명히 기준 API의 설계 목표 중 하나가 아니 었습니다. IMHO 이점은 JPQL의 가독성과 동적 구조의 손실보다 중요하지 않습니다. – kostja

+0

그리고 가독성과 튜토리얼의 요구 사항은 무엇입니까? IMHO [JPA 2.0의 동적, typesafe 쿼리] (http://www.ibm.com/developerworks/library/j-typesafejpa/) 체크 아웃 할 수 있습니다. – perissf

+0

이 질문은 주제가 아니므로 닫으려고합니다. 프로그래밍에 대한 문제가 아니라 이미 작동중인 코드 개선에 관한 것입니다. – TylerH

답변

3

표준을 따르는 그런 종류의 쿼리를 작성하고 손을 사용하지 않으면 어쨌든 표준에서 벗어난 JPQL 쿼리를 작성하지 않을 것이라고 생각하지 않습니다. 많은 쿼리 빌더 같은 자바 기반의 SQL querias을 형 안전, 쓰기 : 그 :)

0

기준 쿼리 같은 JPQL의 몇 가지 장점을 가지고 도울 수 있다면 더 깨끗한 방법으로 쿼리를 작성할 수 query dsl 또는 Torpedo query 또는 Object Query 프로그래밍 모델 및 휴대용. JPA로 작업하기 시작할 때 이것을 이해하는 가장 쉬운 방법은 사용해야 할 주요 객체와 기능에 대해 생각하는 것입니다.

CriteriaBuilder : 기능, 예약 된 작업, 작업과 같은 SQL을 사용하여 수행 할 수있는 모든 문, 술어이 클래스의 일부이므로, 빌더 필요는 사람들을 생성하고 criteriaQuery에 적용하는 데 사용합니다.

CriteriaQuery : 공식 SQL 문 작성을 목표로하는 모든 문구는 여기에서 쿼리 정의의 상용구라고 생각합니다.이 문맥은 from, select, where, group by 및 모든 문을 포함합니다. 이것은 쿼리 자체이며 데이터베이스에서 실제로 찾고있는 것을 결정하는 데 사용해야합니다.

지금 당신은 항상 루트이 그와 CriteriaQuery에서 도움을 기반으로 쿼리 정의에서 메인 테이블을 일 무슨 선택 의미를 사용하도록해야 쿼리를 할 생각 CriteriaBuilder은 당신이 검색을 다시 정의 할 수 있습니다 객체 당신이 원하는대로 되십시오.