2013-08-05 2 views
9

मैं निम्नलिखित HQL बदलने के लिए जेपीए मानदंड का उपयोग करने के कोशिश कर रहा हूँ:मानदंडबिल्डर.और और मानदंडबिल्डर.ओर, कैसे करें?

select distinct d from Department d 
left join fetch d.children c 
where d.parent is null 
and (
    d.name like :term 
    or c.name like :term 
    ) 
order by d.name 

Department बच्चों की एक Set<Department> है।

मानदंड:

and (x = y OR z = y) 

सही ढंग से:

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<Department> c = cb.createQuery(Department.class); 
Root<Department> root = c.from(Department.class); 
root.fetch("children", JoinType.LEFT); 
Path<Department> children = root.join("children", JoinType.LEFT); 
c.orderBy(cb.asc(root.get("name"))); 
c.distinct(true); 
c.where(cb.isNull(root.get("parent"))); 
String param = "%" + "term" + "%"; 
cb.and(cb.like(root.<String> get("name"), param)); 
cb.or(cb.like(children.<String> get("name"), param)); 

TypedQuery<Department> tq = getEntityManager().createQuery(c); 
departments = tq.getResultList(); 

मैं यह थोड़ा संक्षिप्त है, तथापि, HQL रिटर्न 24 और मानदंड संस्करण 28. मुझे लगता है कि मैं से निपटने नहीं कर रहा हूँ हो सकता है। किसी भी पॉइंटर्स की सराहना की जाएगी। धन्यवाद।

उत्तर

23

यहाँ अपने JPQL क्वेरी की जहां खंड है:

where d.parent is null 
and (
    d.name like :term 
    or c.name like :term 
    ) 

जहां खंड दो विधेय शामिल हैं:

d.parent is null 

और

(d.name like :term 
or c.name like :term) 

दूसरा विधेय एक or दो युक्त भविष्यवाणी:

d.name like :term 

और

c.name like :term 

तो आप अपने मापदंड क्वेरी में एक ही संरचना की जरूरत है:

Predicate orClause = 
    cb.or(cb.like(root.<String>get("name"), param), 
      cb.like(children.<String>get("name"), param)); 

c.where(cb.isNull(root.get("parent")), 
     orClause); 
+0

धन्यवाद एक लाख। – kmansoor

+0

इसके लिए धन्यवाद क्योंकि मैं भी इसे ढूंढ रहा था। – user75ponic

संबंधित मुद्दे