2012-06-12 20 views
6

में MAX() का उपयोग करके SELECT क्वेरी के साथ सही मान प्राप्त करने में असमर्थ, मैं जेपीए में नया हूं और जब मैं MAX() फ़ंक्शन का उपयोग कर डेटाबेस से क्वेरी करने का प्रयास करता हूं तो मुझे कोई समस्या है। मेरे फ़ंक्शन का कोड निम्न है। क्या कोई मेरी मदद कर सकता है? धन्यवाद।जेपीए

public int getMaxId(){ 

    entityManager = this.entityManagerFactory.createEntityManager(); 

    Query query = entityManager.createQuery("SELECT * FROM user WHERE id = (SELECT MAX(u.id) FROM user u)"); 
    User user = (User) query.getSingleResult(); 

    int id = user.getId(); 
    return id; 
} 

मैं जेपीए, टॉपलिंक और अपाचे डर्बी का उपयोग कर रहा हूं। मेरी विधि तालिका उपयोगकर्ताओं की अधिकतम आईडी वापस करनी चाहिए।

संपादित करें: मैं एक सेवा से कि फ़ंक्शन को कॉल करें:

try { 
     int id = userDAO.getMaxId(); 
     logger.info("Max id: " + id); 
     user.setId(id+1); 

    } 
    catch (Exception ex){ 
     logger.error("Unable to get the max id."); 
    } 

user.setId() का मूल्य हमेशा '0' है।

संपादित करें (2): लॉग इन करें

Caused by: Exception [EclipseLink-8034] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Error compiling the query [SELECT u FROM user u WHERE u.id = (SELECT MAX(uu.id) FROM user uu)]. Unknown entity type [user]. 
    at org.eclipse.persistence.exceptions.JPQLException.entityTypeNotFound(JPQLException.java:483) 
    at org.eclipse.persistence.internal.jpa.parsing.ParseTreeContext.classForSchemaName(ParseTreeContext.java:138) 
    at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getClassOfFirstVariable(SelectNode.java:327) 
    at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getReferenceClass(SelectNode.java:316) 
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.getReferenceClass(ParseTree.java:436) 
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.adjustReferenceClassForQuery(ParseTree.java:75) 
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateReadQueryInternal(JPQLParseTree.java:103) 
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateQuery(JPQLParseTree.java:84) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:219) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:190) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:142) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:126) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1475) 
    ... 35 more 

मेरे इकाई User इस प्रकार घोषित किया जाता है:

@Entity 
@Table(name = "user") 
public class User { 

@Id 
private int id; 
private String name; 
private String lastName; 
private String city; 
private String password; 
+2

मैं जेनरेट किए गए आईडी मानों का उपयोग करने का सुझाव देता हूं। – JMelnik

+1

आपको अपवाद को निगलना नहीं चाहिए, अधिक जानकारी के लिए पूर्ण त्रुटि स्टैक मुद्रित करने के लिए 'ex.printStackTrace()' का उपयोग करने का प्रयास करें। –

+0

@JMelnik हाँ, मैं सहमत हूं लेकिन मैं समझना चाहता था कि कैसे जेपीए/जेपीक्यूएल लगातार निरंतर पूछताछ और प्रश्नों का उपयोग करने की कोशिश कर रहा है। – Spacemonkey

उत्तर

20

आप सीधे अधिक सरल JPQL उपयोग कर सकते हैं

return (Integer)entityManager.createQuery("select max(u.id) from User u").getSingleResult(); 

या TypedQuery

का उपयोग
return entityManager.createQuery("select max(u.id) from User u", Integer.class).getSingleResult(); 

संपादित करें:

Unknown entity type [user] 

आप User बजाय user उपयोग करना चाहिए।

+0

आपके उत्तर के लिए धन्यवाद प्रकट करेगा। मैंने कोड को संशोधित करने का प्रयास किया है लेकिन यह अभी भी एक मूल्य वापस नहीं कर रहा है। जब मैं किसी भी वस्तु को जारी रखने की कोशिश करता हूं तो मैं ऐसा करता हूं और बिना किसी समस्या के। entityManager.getTransaction().begin(); entityManager.persist(user); entityManager.getTransaction().commit(); लेकिन क्वेरी ठीक काम नहीं कर रही हैं, मुझे नहीं पता क्यों। – Spacemonkey

+0

@ जूलियन वापस मूल्य का मतलब नहीं है? मूल्य गलत है? –

+0

हैलो पॉ, इसका मतलब है कि MaxId() फ़ंक्शन हमेशा कॉल लेयर() अपडेट में) पकड़ लेता है (अपडेट देखें) – Spacemonkey

2

अच्छी तरह से आपकी टिप्पणियों से कहना मुश्किल है और आपने कोई लॉगिंग पोस्ट नहीं की है।

कैसे इस बारे में:

Query query = entityManager.createQuery("SELECT u FROM users u WHERE u.id = (SELECT MAX(u.id) FROM users u)"); 
+0

प्लस 1 हां यह अच्छा काम करता है :) –

1

इम कि कोड का उपयोग करना:

Query qry = em.createQuery("SELECT MAX(t.column) FROM Table t"); 
    Object obj = qry.getSingleResult(); 
    if(obj==null) return 0; 
    return (Integer)obj; 

कारण अगर कोई तालिका "टी" पर कोई तत्व, NullPointerException फेंक रहा है।

-2

यह एक अच्छा समाधान है, लेकिन आपको एसक्यूएल के दो भाग में अलग-अलग नामों का उपयोग करना होगा। इस तरह: "उपयोगकर्ताओं से आपको चुनें जहां u.id = (उपयोगकर्ता यू 2 से MAX (u2.id) चुनें)"