2014-01-24 34 views
0

我瞭解在Java持久性查詢語言之上使用JPA標準構建器的優點。JPA標準構建器 - 用人類可讀的語言編寫

有沒有簡單的方法來解釋如何建立這種查詢? 我需要一個更可讀的解釋,以建立我的查詢,這有一種直觀的方法來查詢我的數據庫

實施例:

SQL:

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

性判據Builder和元模型:

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的設計目標之一:)恕我直言,好處不會超過JPQL的可讀性和動態結構的損失 – kostja

+0

除了可讀性和教程的要求之外,還有什麼問題?恕我直言,你可以檢查[動態,JPA 2.0類型安全查詢](http://www.ibm.com/developerworks/library/j-typesafejpa/) – perissf

+0

我投票結束這個問題作爲題外話,因爲它是不是關於編程的問題,而是關於改進已經運行的代碼。 – TylerH

回答

3

我不覺得有寫那種查詢遵循標準的更清潔的方式,而不是用手工寫JPQL查詢,反正出來的標準是許多查詢生成器,如:query dslTorpedo queryObject Query允許寫查詢在一個更清潔的方式,如果可以幫助:)

0

標準查詢有JPQL的一些優點,如:基於Java類型安全,寫SQL querias編程模型,並使其便攜。在我開始使用JPA時,我理解這一點的最簡單方法是在您需要使用的主要對象及其功能中考慮。

CriteriaBuilder:可以使用SQL類似功能的保留作品,操作作出的任何聲明,謂詞是這個類的一部分,因此製造商需要被用來創建這些並把它們應用到CriteriaQuery中。

CriteriaQuery:任何以創建正式SQL語句爲目標的語句都在這裏,將其視爲查詢定義的樣板,它具有select,where,group by和all語句,所以這是查詢本身,必須用它來確定你真正從數據庫中尋找什麼。

現在想辦一個查詢你總是必須使用,這意味着選擇什麼將是你的主表中查詢定義,基於這一點,從CriteriaQuery中幫助和CriteriaBuilder對象,可以重新定義搜索無論你想要什麼。