2010-10-01 16 views
14

के साथ जटिल प्रश्न क्या कोई मुझे सुझाव दे सकता है कि जेपीए मानदंड निर्माता एपीआई का उपयोग करके निम्नलिखित क्वेरी कैसे बनाएं?जेपीए मानदंड निर्माता

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

अगर मैं एक समाधान है जो गतिशील रूप से एक Map<String,String> मेटामॉडल वर्ग या किसी अन्य तरीके से उपयोग करते हुए के रूप में दिए गए मापदंडों के आधार पर बनाता है पा सकते हैं यह बेहतर है।

उत्तर

37

यह (मेटामॉडल के बिना) इस तरह है:

Map<String, 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<String, Object> param: params.entrySet()) 
    p = cb.and(p, cb.equal(r.get(param.getKey()), param.getValue())); 

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

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

या मेटामॉडल साथ (typesafe, लेकिन थोड़ा अधिक शब्दों):

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(); 
संबंधित मुद्दे