2011-02-13 19 views
7

के साथ एक छोटी सी क्वेरी को पार्स करने में सिंटेक्स त्रुटि मैंने नेटबीन्स विज़ार्ड के साथ इकाई बीन बनाया और डेटाबेस से डेटा प्राप्त करने का प्रयास कर रहा हूं। इससे कोई फर्क नहीं पड़ता कि मैं किस SQL ​​क्वेरी का उपयोग करता हूं, यह काम नहीं करता है।जेपीए

@NamedQuery(name = "Usr.findAll", query = "SELECT u FROM Usr u") 

यह रिटर्न:: मैं नामित क्वेरी कि जादूगर द्वारा बनाया गया था उपयोग करने की कोशिश

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [Usr.findAll], line 1, column 0: unexpected token [Usr]. 

अगर मैं कोशिश;

SELECT uid FROM usr; 

मैं:

Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [SELECT uid FROM usr;], line 0, column -1: unexpected end of query. 
Internal Exception: MismatchedTokenException(-1!=78) 

और यहां तक ​​कि अगर मैं कोशिश:

SELECT * FROM usr 

मैं:

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [SELECT * FROM usr], line 1, column 7: unexpected token [*]. 

डेटा प्राप्त करने के लिए मेरी लाइन है:

@PersistenceContext 
EntityManager em; 
.... 

em=Persistence.createEntityManagerFactory("SchoolPU").createEntityManager(); 
List users = em.createQuery("SELECT * FROM usr").getResultList(); 

कोई भी इस छोटी समस्या के साथ मेरी मदद कर सकता है?

Usr इकाई वर्ग:

import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Lob; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 

/** 
* 
* @author danizmax 
*/ 
@Entity 
@Table(name = "USR") 
@NamedQueries({ 
    @NamedQuery(name = "Usr.findAll", query = "SELECT u FROM Usr u"), 
    @NamedQuery(name = "Usr.findByUid", query = "SELECT u FROM Usr u WHERE u.uid = :uid"), 
    @NamedQuery(name = "Usr.findByPassword", query = "SELECT u FROM Usr u WHERE u.password = :password"), 
    @NamedQuery(name = "Usr.findByFistname", query = "SELECT u FROM Usr u WHERE u.fistname = :fistname"), 
    @NamedQuery(name = "Usr.findByLastname", query = "SELECT u FROM Usr u WHERE u.lastname = :lastname"), 
    @NamedQuery(name = "Usr.findByAddress1", query = "SELECT u FROM Usr u WHERE u.address1 = :address1"), 
    @NamedQuery(name = "Usr.findByAddress2", query = "SELECT u FROM Usr u WHERE u.address2 = :address2"), 
    @NamedQuery(name = "Usr.findByPostcode", query = "SELECT u FROM Usr u WHERE u.postcode = :postcode"), 
    @NamedQuery(name = "Usr.findByEmail", query = "SELECT u FROM Usr u WHERE u.email = :email"), 
    @NamedQuery(name = "Usr.findByPhone", query = "SELECT u FROM Usr u WHERE u.phone = :phone")}) 
public class Usr implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "UID", nullable = false, length = 8) 
    private String uid; 
    @Basic(optional = false) 
    @Column(name = "PASSWORD", nullable = false, length = 20) 
    private String password; 
    @Basic(optional = false) 
    @Column(name = "FISTNAME", nullable = false, length = 30) 
    private String fistname; 
    @Basic(optional = false) 
    @Column(name = "LASTNAME", nullable = false, length = 60) 
    private String lastname; 
    @Basic(optional = false) 
    @Column(name = "ADDRESS1", nullable = false, length = 100) 
    private String address1; 
    @Column(name = "ADDRESS2", length = 100) 
    private String address2; 
    @Basic(optional = false) 
    @Lob 
    @Column(name = "CITY", nullable = false) 
    private byte[] city; 
    @Basic(optional = false) 
    @Column(name = "POSTCODE", nullable = false, length = 10) 
    private String postcode; 
    @Column(name = "EMAIL", length = 50) 
    private String email; 
    @Column(name = "PHONE") 
    private Integer phone; 

    public Usr() { 
    } 

    public Usr(String uid) { 
     this.uid = uid; 
    } 

    public Usr(String uid, String password, String fistname, String lastname, String address1, byte[] city, String postcode) { 
     this.uid = uid; 
     this.password = password; 
     this.fistname = fistname; 
     this.lastname = lastname; 
     this.address1 = address1; 
     this.city = city; 
     this.postcode = postcode; 
    } 

    public String getUid() { 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getFistname() { 
     return fistname; 
    } 

    public void setFistname(String fistname) { 
     this.fistname = fistname; 
    } 

    public String getLastname() { 
     return lastname; 
    } 

    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 

    public String getAddress1() { 
     return address1; 
    } 

    public void setAddress1(String address1) { 
     this.address1 = address1; 
    } 

    public String getAddress2() { 
     return address2; 
    } 

    public void setAddress2(String address2) { 
     this.address2 = address2; 
    } 

    public byte[] getCity() { 
     return city; 
    } 

    public void setCity(byte[] city) { 
     this.city = city; 
    } 

    public String getPostcode() { 
     return postcode; 
    } 

    public void setPostcode(String postcode) { 
     this.postcode = postcode; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public Integer getPhone() { 
     return phone; 
    } 

    public void setPhone(Integer phone) { 
     this.phone = phone; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (uid != null ? uid.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Usr)) { 
      return false; 
     } 
     Usr other = (Usr) object; 
     if ((this.uid == null && other.uid != null) || (this.uid != null && !this.uid.equals(other.uid))) { 
      return false; 
     } 
     return true; 
    } 



    @Override 
    public String toString() { 
     return "org.danizmax.Usr[uid=" + uid + "]"; 
    } 

} 

persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SchoolPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/school</jta-data-source> 
    <properties> 
    </properties> 
    </persistence-unit> 
</persistence> 

वर्ग जहां मैं इकाई का उपयोग करें:

import java.util.Iterator; 
import java.util.List; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 
import javax.persistence.PersistenceContext; 

/** 
* 
* @author danizmax 
*/ 
@Stateless 
public class ValidatorBean { 

    @PersistenceContext 
    EntityManager em; 

    public ValidatorBean() { 


    } 

    public boolean validate(String user, String pass) { 

     List users = em.createQuery("SELECT * FROM usr").getResultList(); 

     Iterator it = users.iterator(); 

     //ignore the stupid validation it's only to try out JPA 
     while(it.hasNext()){ 
      Usr u = (Usr) it.next(); 

      if(u.getUid().equals(user) && u.getPassword().equals(pass)){ 
       return true; 
      } 
     } 


     return false; 
    } 
} 

अद्यतन: आप निष्पक्ष रहने के लिए जो लोग आपके प्रयास का उत्तर देते हैं और इनाम देते हैं, अब मैं वास्तव में टी को सीखा तकनीक और वास्तविक दुनिया में इसका उपयोग करते हुए, मैंने इस जवाब को सबसे अच्छा जवाब देने के साथ बंद करने का फैसला किया जो कि मेरे सबसे संभावित समाधान था, मैंने अपने स्वयं को बहुत समय पहले पाया था।

+0

मुझे एक समाधान मिला, लेकिन अब और याद नहीं है कि वास्तव में क्या था, केवल कोड में कास्टिंग के साथ कुछ करना था। अगर मुझे पता चलता है कि यह वास्तव में क्या था, तो मैं इसे एक उत्तर के रूप में पोस्ट करूंगा। – danizmax

उत्तर

4

केवल अपने पहले प्रश्न सही है, दूसरों JPQL नहीं हैं, इसलिए चाहिए त्रुटियों का कारण। SQL के लिए @NamedNativeQuery का उपयोग करें।

पहले प्रश्न के लिए, यह क्या तुम सच में त्रुटि प्राप्त करने के लिए प्रयोग कर रहे हैं होने के लिए प्रकट नहीं होता है,

अपवाद वर्णन: सिंटैक्स त्रुटि क्वेरी [Usr.findAll], लाइन 1, स्तंभ 0 पार्स करने : अप्रत्याशित टोकन [Usr]।

त्रुटि नोट करें कि "कॉलम 0" "Usr" है जो लगता है कि आपने नाम के बजाय क्वेरी में नाम रखा है। मेरा अनुमान है कि आप कर रहे हैं,

em.createQuery ("Usr.findAll")। GetResultList();

लेकिन करना चाहिए,

em.createNamedQuery ("Usr.findAll") getResultList()।;

या,

em.createQuery ("यू Usr यू से चुनें") getResultList()।;

देखें, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL

+0

आपका उत्तर सबसे ज्यादा बताता है, बधाई! – danizmax

2

उस इकाई का वर्ग नाम क्या है जिसे आप लाने का प्रयास कर रहे हैं? (शायद आपको उस कक्षा को दिखाने की ज़रूरत है जहां आपने @NamedQuery रखा था)।

क्या यह वास्तव में Usr है या यह शायद User है? यदि अंतिम सत्य है, Select u from User u निश्चित रूप से काम करना चाहिए।

इसके अतिरिक्त, आपको @PersistenceContext और em=Persistence.createEntityManagerFactory(...) दोनों की आवश्यकता नहीं है। उनमें से किसी एक का प्रयोग करें। यदि आप एक प्रबंधित वातावरण में हैं, तो इंजेक्शन संस्करण का उपयोग करें। एक इकाई प्रबंधक बनाना स्वयं आपको एक तथाकथित application managed entity manager देता है जिसके लिए आपके कोड को चीजों को सही रखने के लिए बहुत अधिक प्रशासन करना पड़ता है।

+0

इकाई उपयोगकर्ता को नेटबीन्स विज़ार्ड का उपयोग कर मौजूदा डर्बी टेबल से बनाया गया था, इसलिए मुझे लगता है कि कुछ और गलत है, क्योंकि मेरा कोड हैलो वर्ल्ड तुच्छ और यहां तक ​​कि इकाई वर्ग से डेटाबेस में टेबल की स्वत: पीढ़ी भी काम नहीं कर रही है और यह चाहिए। मुझे कैसे पता चलेगा कि मैं प्रबंधित वातावरण में हूं या नहीं? – danizmax

+0

यदि आप ग्लासफ़िश पर तैनात कर रहे हैं और जिस कोड में @PersistenceContext प्रकट होता है वह एक Servlet, ServletFilter, JSF प्रबंधित बीन, सीडीआई बीन, या ईजेबी बीन है, तो आप एक प्रबंधित वातावरण में हैं। इसका मूल रूप से मतलब है कि आप उन ऑब्जेक्ट्स को नए ऑपरेटर के साथ तुरंत चालू नहीं करते हैं और आप केवल persistence.xml फ़ाइल का उपयोग करके दृढ़ता इकाई घोषित करते हैं। –

+0

मैंने कक्षा को जोड़ा, ध्यान दें कि यह यूएसआर तालिका से विज़ार्ड जेनरेट क्लास है। यह काम करना चाहिए, तालिका कार्यों में डेटा कर रहा है, एसक्यूएल कथन सिर्फ मान्यता प्राप्त नहीं हैं। मैं persistence.xml भी जोड़ूंगा, यह आपको यह विचार दे सकता है कि क्या गलत है। मैं कनेक्शन के लिए EclipseLink 2.0 का उपयोग कर रहा हूँ। – danizmax

0

EclipseLink अपेक्षाकृत सरल कॉन्फ़िगरेशन समस्याओं पर सुंदर जेनेरिक या गुप्त त्रुटि संदेश देने की प्रवृत्ति है।

मुझे लगता है कि आप persistence.xml में Usr कक्षा का संदर्भ खो रहे हैं। आपको या तो वर्ग जोड़ना होगा, या एक पथ संदर्भ जोड़ना होगा जो EclipseLink को बताता है कि दृढ़ता के लिए कौन सी कक्षाओं को संसाधित करना है।यहाँ एक प्रत्यक्ष वर्ग संदर्भ में एक उदाहरण है:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SchoolPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/school</jta-data-source> 
    <class>my.package.Usr</class> 
    </persistence-unit> 
</persistence> 

एक वर्ग संदर्भ सबसे सीधे आगे दृष्टिकोण है, लेकिन अगर आप कई श्रेणियां होती हैं का प्रबंधन करने के थकाऊ बन सकता है।

+0

पहले से ही कोशिश की गई ... परिणाम वही है। नामांकित क्वेरी "Usr.findAll" अभी भी क्वेरी [Usr.findAll], लाइन 1, कॉलम 0: अप्रत्याशित टोकन [Usr] को पार्स करने में सिंटेक्स त्रुटि देता है। मैं शर्त लगाता हूं कि नेटबीन की स्थापना के साथ कुछ गड़बड़ है। – danizmax

0

मुझे एक ही समस्या थी। Strangs समाधान - मेरे लिए - था: Toplink persistence.xml की तुलना करते समय "Tablename" केस संवेदनशील व्यवहार करता है। इसलिए यदि आप अपने जावा कक्षाओं के लिए मानक ऊंट केस नामों का उपयोग करते हैं तो आपको अपनी क्वेरी में उसी ऊंट केस नामों का उपयोग करना होगा। मुझे पूरी तरह से भ्रामक त्रुटि संदेश की तरह बहुत पसंद है।

+0

मैंने बीन, इकाई, persistance.xml में अपरकेस में सभी को रूपांतरित/दोबारा संशोधित किया, यहां तक ​​कि डेटाबेस भी वही दिखाता है और मैं अभी भी अपवाद विवरण प्राप्त कर रहा हूं: क्वेरी [यूएसआर.फिंडएएल], लाइन 1, कॉलम 0: अनपेक्षित रूप से पार्सिंग सिंटैक्स त्रुटि टोकन [यूएसआर]। सरल जेपीए के लिए बहुत कुछ .... – danizmax

5

मुझे एक ही समस्या थी। मेरे मामले में मैंने विधि
em.createQuery ("Usr.findAll") का उपयोग किया;

em.createNamedQuery ("Usr.findAll") के बजाय;

+0

मैंने बस एक ही चीज़ पर 2 घंटे बर्बाद कर दिया ... जबकि मैं स्वीकार करता हूं कि त्रुटि मेरी गलती थी, मैं इस बात से बहुत खुश नहीं हूं कि त्रुटि संदेश कितना वर्णनात्मक है ... – jahroy

1

सुनिश्चित नहीं है कि यह आपकी मदद करेगा या नहीं, क्योंकि यह प्रश्न थोड़ा पुराना प्रतीत होता है। लेकिन अगर आप के रूप में .createNativeQuery(...) बजाय .createQuery(...) उपयोग कर सकते हैं:

List users = em.createNativeQuery("SELECT * FROM usr").getResultList();
0

मैं अपने @NamedQuery के साथ इस तरह एक समस्या थी। यह बिल्कुल काम नहीं किया। मैंने em.createQuery("anything.anotherthing") को em.createNamedQuery("anything.anotherthing") से बदलकर समस्या हल की और अब यह ठीक काम कर रहा है।