2012-03-31 8 views
87

मैं "उन" तालिका से सभी उपयोगकर्ताओं की सूची प्राप्त करने के लिए कोशिश कर रहा हूँ और मैं निम्नलिखित त्रुटि मिलती है:हाइबरनेट त्रुटि - QuerySyntaxException: उपयोगकर्ता [उपयोगकर्ताओं से] मैप नहीं है

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users] 
org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180) 
org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110) 
org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93) 

यह वह जगह है कोड मैं जोड़ने के लिए/उपयोगकर्ताओं मिल ने लिखा है:

public List<User> getUsers() { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    List<User> result = (List<User>) session.createQuery("from users").list(); 
    session.getTransaction().commit(); 
    return result; 
} 

public void addUser(User user) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    session.save(user); 
    session.getTransaction().commit(); 
} 

public void addUser(List<User> users) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    for (User user : users) { 
     session.save(user); 
    } 
    session.getTransaction().commit(); 
} 

जोड़ा जा रहा है उन से काम करता है, लेकिन जब मैं getUsers फ़ंक्शन का उपयोग मैं इन त्रुटि मिलती है।

यह मेरी हाइबरनेट कॉन्फ़िग फ़ाइल है:

<hibernate-configuration> 
<session-factory> 
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password">root</property> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.default_schema">test</property> 
    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 

    <property name="show_sql">true</property> 

    <property name="format_sql">true</property> 
    <property name="hbm2ddl.auto">create-drop</property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 
    <property name="current_session_context_class">thread</property> 

    <!-- Mapping files will go here.... --> 

    <mapping class="model.Company" /> 
    <mapping class="model.Conference" /> 
    <mapping class="model.ConferencesParticipants" /> 
    <mapping class="model.ConferenceParticipantStatus" /> 
    <mapping class="model.ConferencesUsers" /> 
    <mapping class="model.Location" /> 
    <mapping class="model.User" /> 

</session-factory> 

और यह मेरा उपयोगकर्ता वर्ग है:

@Entity 
@Table(name = "Users") 
public class User implements Serializable{ 

    private long userID; 
    private int pasportID; 
    private Company company; 
    private String name; 
    private String email; 
    private String phone1; 
    private String phone2; 
    private String password; //may be null/empty , will be kept hashed 
    private boolean isAdmin; 
    private Date lastLogin; 

    User() {} //not public on purpose! 

    public User(int countryID, Company company, String name, String email, 
      String phone1, String phone2, String password, boolean isAdmin) { 
     this.pasportID = countryID; 
     this.company = company; 
     this.name = name; 
     this.email = email; 
     this.phone1 = phone1; 
     this.phone2 = phone2; 
     this.password = password; 
     this.isAdmin = isAdmin; 
    } 

    @Id 
    @GeneratedValue(generator="increment") 
    @GenericGenerator(name="increment", strategy = "increment") 
    public long getUserID() { 
     return userID; 
    } 
    public void setUserID(long userID) { 
     this.userID = userID; 
    } 
    ...  
} 

किसी भी विचार क्यों मैं इस त्रुटि मिलती है?

+1

से संबंधित: http://stackoverflow.com/questions/14446048/hibernate-table-not-mapped-error – Gray

उत्तर

211

HQL में, आप जावा वर्ग नाम और मैप की @Entity वास्तविक तालिका नाम और स्तंभ नाम के बजाय की संपत्ति के नाम का उपयोग करना चाहिए, ताकि HQL होना चाहिए:

List<User> result = (List<User>) session.createQuery("from User").list(); 
+5

तो वास्तव में यह भी मामला संवेदनशील है। इसलिए "उपयोगकर्ता से" के परिणामस्वरूप एक ही अपवाद – tObi

+1

इसका उत्तर का एक हिस्सा होगा, लेकिन त्रुटि को हल करने के लिए मुझे इस तरह के पूर्ण ऑब्जेक्ट पथ का उपयोग करना पड़ा: [...]। createQuery ("gcv.metier.User से जैसे आप u.username =? ") – Raphael

11

बस मेरी खोज साझा करने के लिए । मुझे अभी भी वही त्रुटि मिली है, भले ही क्वेरी सही वर्ग नाम को लक्षित कर रही हो। बाद में मुझे एहसास हुआ कि मैं गलत पैकेज से इकाई वर्ग आयात कर रहा था।

import org.hibernate.annotations.Entity; 

जोड़ा गया @TABLE(name = "TABLE_NAME") एनोटेशन को
import javax.persistence.Entity; 
+0

मेरे लिए यह काम है। – PKTomar

7

और फिक्स्ड: मैं से आयात लाइन बदलने के बाद

समस्या हल हो गया था। अपनी एनोटेशन और hibernate.cfg.xml फ़ाइल देखें। यह नमूना इकाई फ़ाइल है कि काम करता है:

import javax.persistence.*; 

@Entity 
@Table(name = "VENDOR") 
public class Vendor { 

    //~ --- [INSTANCE FIELDS] ------------------------------------------------------------------------------------------ 
    private int id; 
    private String name; 

    //~ --- [METHODS] -------------------------------------------------------------------------------------------------- 
    @Override 
    public boolean equals(final Object o) {  
     if (this == o) { 
      return true; 
     } 

     if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 

     final Vendor vendor = (Vendor) o; 

     if (id != vendor.id) { 
      return false; 
     } 

     if (name != null ? !name.equals(vendor.name) : vendor.name != null) { 
      return false; 
     } 

     return true; 
    } 

    //~ ---------------------------------------------------------------------------------------------------------------- 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Id 
    public int getId() { 
     return id; 
    } 

    @Basic 
    @Column(name = "NAME") 
    public String getName() { 

     return name; 
    } 

    public void setId(final int id) { 
     this.id = id; 
    } 

    public void setName(final String name) {  
     this.name = name; 
    } 

    @Override 
    public int hashCode() { 
     int result = id; 
     result = 31 * result + (name != null ? name.hashCode() : 0); 
     return result; 
    } 
} 
+0

कृपया अपने कोड उदाहरण को कम करने पर विचार करें। – Gray

4

इस बात की संभावना आप hibernate.cfg.xml में बनाया इकाई के लिए मानचित्रण जोड़ने के लिए, एक ही गलती को भूल गया है।

+0

मैं भी hibernate.cfg.xml में POJO वर्ग जोड़ने के लिए भूल गया। – Chinmoy

13

उदाहरण के लिए: अपने सेम वर्ग के नाम आप Db पर अपनी तालिका नाम देना नहीं है UserDetails

Query query = entityManager. createQuery("Select UserName from **UserDetails** "); 

है। आपको बीन क्लास नाम देता है।

2

मैं भी गलत इकाई import org.hibernate.annotations.Entity; का आयात किया गया था यह आयात javax.persistence.Entity;

5

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]

होना चाहिए यह बताता है कि हाइबरनेट "उन" के रूप में User इकाई नहीं जानता है।

@javax.persistence.Entity 
@javax.persistence.Table(name = "Users") 
public class User { 

@Table एनोटेशन तालिका नाम सेट "उपयोगकर्ता" लेकिन इकाई नाम अभी भी "उपयोगकर्ता" के रूप में जाना जाता है HQL में किया जाना है।

// this sets the name of the table and the name of the entity 
@javax.persistence.Entity(name = "Users") 
public class User implements Serializable{ 

अधिक जानकारी के लिए यहाँ मेरा उत्तर देखें:: Hibernate table not mapped error

3

भी जाँच लें कि आप का उपयोग कर एनोटेट वर्ग कहा:

दोनों बदलने के लिए आपको संस्था का नाम भी तय करना चाहिए

new Configuration().configure("configuration file path").addAnnotatedClass(User.class)

हाइबरनेट का उपयोग कर डेटाबेस में एक नई तालिका जोड़ते समय हमेशा अपना समय बर्बाद कर दिया।

5

भी सुनिश्चित करें कि निम्नलिखित संपत्ति अपने हाइबरनेट सेम विन्यास में सेट किया गया है:

<property name="packagesToScan" value="yourpackage" /> 

यह वसंत बताता है और हाइबरनेट जहां संस्थाओं के रूप में व्याख्या किए गए आपके डोमेन कक्षाएं लगाने के लिए।

5

कुछ लिनक्स आधारित MySQL प्रतिष्ठानों को केस संवेदनशील की आवश्यकता होती है। nativeQuery लागू करने के लिए चारों ओर काम करना है।

@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true) 
+0

क्या आप वाकई "लिनक्स आधारित MySQL" की भूमिका निभाते हैं? – asgs

0

मैं जब मैं हाइबरनेट कोर-5.2.12 के साथ पुराने हाइबरनेट कोर पुस्तकालय की जगह इस मुद्दे मिला है। हालांकि मेरी सभी विन्यास ठीक थी। और मैं इस तरह से sessionfactory बनाने के द्वारा इस समस्या का समाधान हो:

private static SessionFactory buildsSessionFactory() { 
    try { 
     if (sessionFactory == null) { 
      StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() 
        .configure("/hibernate.cfg.xml").build(); 
      Metadata metaData = new MetadataSources(standardRegistry) 
        .getMetadataBuilder().build(); 
      sessionFactory = metaData.getSessionFactoryBuilder().build(); 
     } 
     return sessionFactory; 
    } catch (Throwable th) { 

     System.err.println("Enitial SessionFactory creation failed" + th); 

     throw new ExceptionInInitializerError(th); 

    } 
} 

यह आशा है कि कोई मदद करता है

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