2013-05-02 4 views
8

मैं जेपीए 2.0 का उपयोग कर रहा हूं। हाइबरनेट 4.1.0. फ़ाइनल, और जावा 6. मैं निम्नलिखित psuedo-SQL से जेपीए क्वेरी कैसे लिखूं?मैं जेपीए 2.0 में कहां से एक खंड के साथ एक MAX क्वेरी लिखूं?

select max(e.dateProcessed) from Event e where e.org = myOrg 

और मेरे डोमेन वस्तु ऐसा दिखाई देता है:

@GenericGenerator(name = "uuid-strategy", strategy = "org.mainco.subco.core.util.subcoUUIDGenerator") 
@Entity 
@Table(name = "sb__event", 
    uniqueConstraints = { @UniqueConstraint(columnNames={"EVENT_ID"}) } 
) 
public class Event 
{ 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(generator = "uuid-strategy") 
    private String id; 

    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.REMOVE}) 
    @JoinColumn(name = "ORGANIZATION_ID", nullable = false, updatable = true) 
    private Organization org; 

    @Column(name = "DATE_PROCESSED") 
    @NotNull 
    private java.util.Date dateProcessed; 

मुझे पता है कि CriteriaBuilder.greatest शामिल है, लेकिन मैं तो बस को समझ नहीं सकता कैसे क्वेरी लिखने के लिए। यह संगठन से मेल खाने वाली सभी घटना वस्तुओं को वापस कर देगा, लेकिन जहां तक ​​मुझे मिल गया है।

final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder(); 
final CriteriaQuery<Event> criteria = builder.createQuery(Event.class); 
final Root<Event> event = criteria.from(Event.class); 
criteria.select(event); 
criteria.where(builder.equal(Event.get("org"), org)); 
results.addAll(m_entityManager.createQuery(criteria).getResultList()); 

उत्तर

21

दो तरीके हैं, एक जेपीक्यूएल का उपयोग करते हुए, दूसरे मानदंड प्रश्नों का उपयोग करते हैं।
JPQL बस है:

em.createQuery("select max(e.dateProcessed) from Event e where e.org = :myOrg") 
    .setParameter("myOrg", myOrg) 
    .getSingleResult(); 

मापदंड का उपयोग करते समय आप हो सकता है:

CriteriaBuilder qb = em.getCriteriaBuilder(); 
CriteriaQuery<Number> cq = qb.createQuery(Number.class); 
Root<Event> root = cq.from(Event.class); 
cq.select(qb.max(root.get("dateProcessed"))); 
cq.where(qb.equal(Event.get("org"), qb.parameter(MyOrgType.class, "myOrg"))); 
em.createQuery(cq).setParameter("myOrg", myOrg).getSingleResult(); 
+0

जब से मैं एक "java.util.Date वापस जाने के लिए चाहते हैं, "मुझे लगता है कि मैं लाइन बदलता हूं" CriteriaQuery cq = qb.createQuery (Number.class); " "CriteriaQuery सीक्यू = qb.createQuery (Date.class);"। किसी भी तरह से, मुझे लाइन पर संकलन त्रुटि मिल रही है "cq.select (qb.max (root.get (" dateProcessed "));"। यह कहता है "बाउंड मिस्चैच: जेनेरिक विधि अधिकतम (अभिव्यक्ति ) प्रकार का मानदंडबिल्डर (पथ ) के लिए लागू नहीं है। अनुमानित प्रकार ऑब्जेक्ट बाध्य पैरामीटर के लिए एक मान्य विकल्प नहीं है " – Dave

+3

मैंने नहीं किया ध्यान दें कि मैक्स केवल अभिव्यक्ति लेता है, जो जेपीक्यूएल अधिकतम अभिव्यक्ति से अलग है जो किसी भी पथ अभिव्यक्ति को स्वीकार करेगा। यह प्रश्न में शामिल है http://stackoverflow.com/questions/9616390/select-max-timestamp-with-jpa2-criteria-api – Chris

+4

जब मैंने "महानतम" ('root.get ("dateProcessed") को बदल दिया 'root.get (Event_.dateProcessed)') सबकुछ बढ़िया काम करता है। – Dave

0
साथ

JPQL और CriteriaBuilder

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
javax.persistence.criteria.CriteriaQuery cq= getEntityManager().getCriteriaBuilder().createQuery(); 
Root<T> c = cq.from(getEntityClass()); 
cq.select(cb.max(c.get("id"))); 
संबंधित मुद्दे