हाइबरनेट त्रुटि - QuerySyntaxException: उपयोगकर्ताओं को मैप नहीं किया गया है [उपयोगकर्ताओं से]


126

मैं "उपयोगकर्ता" तालिका से सभी उपयोगकर्ताओं की सूची प्राप्त करने की कोशिश कर रहा हूं और मुझे निम्नलिखित त्रुटि मिलती है:

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();
}

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

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

<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;
    }
    ...    
}

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


जवाबों:


297

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

List<User> result = session.createQuery("from User", User.class).getResultList();

अपडेट: अधिक सटीक होने के लिए, आपको @Entity"तालिका" को संदर्भित करने के लिए कॉन्फ़िगर किए गए इकाई नाम का उपयोग करना चाहिए , जो मैप किए गए जावा वर्ग के अयोग्य नाम के लिए डिफ़ॉल्ट है यदि आप इसे स्पष्ट रूप से सेट नहीं करते हैं।

(पुनश्च यह है, @javax.persistence.Entityलेकिन नहीं @org.hibernate.annotations.Entity)


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

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

मुझे भी पूरे रास्ते का उपयोग करना पड़ा, शायद जेपीए के पास "उपयोगकर्ता" शब्द के साथ एक मुद्दा है? मुझे लगता है कि यह कुछ DB कार्यान्वयनों में एक आरक्षित शब्द है। वास्तव में, यह मुद्दा केवल तब सामने आया जब मैंने उस डीबी तालिका को उपयोगकर्ता से the_user (दूसरे मुद्दे को ठीक करने का हिस्सा) का नाम बदल दिया, इससे पहले कि जेपीए ठीक था।
माइकल कॉक्सन

1
क्या आप सूची को अपडेट कर सकते हैं () पाने के लिए () पूर्व के रूप में पदावनत किया गया है?
दुरजा आराई

31

उदाहरण के लिए: आपका बीन क्लास नाम UserDetails है

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

आप अपनी तालिका का नाम Db पर नहीं देते हैं। आप बीन का वर्ग नाम देते हैं


12

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

आयात रेखा बदलने के बाद समस्या हल हो गई:

import org.hibernate.annotations.Entity;

सेवा

import javax.persistence.Entity;

अब इसने मुझे वास्तव में बचा लिया।
अनिरुद्ध

9

जोड़ा गया @TABLE(name = "TABLE_NAME")एनोटेशन और फिक्स्ड। अपने एनोटेशन और 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;
    }
}

8

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


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

6

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{

अधिक जानकारी के लिए मेरा जवाब यहां देखें: हाइबरनेट तालिका में त्रुटि नहीं है


5

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

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

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


5

कुछ लिनक्स आधारित MySQL इंस्टालेशन को केस सेंसिटिव की आवश्यकता होती है। चारों ओर काम करना है nativeQuery

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

1
क्या आप सुनिश्चित हैं कि "लिनक्स-आधारित MySQL" की यहाँ एक भूमिका है?
asgs

3

मैं भी गलत Entity आयात कर रहा था import org.hibernate.annotations.Entity; यह आयात होना चाहिएjavax.persistence.Entity;


3

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

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

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


2

मुझे वही त्रुटि मिल रही थी जबकि स्प्रिंग हाइबरनेट के createQueryसाथ..मैं अपने बयान में निचले हिस्से में "उपयोगकर्ता" का उपयोग कर रहा था और मेरी कक्षा उपयोगकर्ता थी। मैंने इसे अपनी क्वेरी में उपयोगकर्ता में बदल दिया और समस्या हल हो गई।

पहले प्रश्न:

Query query= em.createQuery("select u from user u where u.username=:usr AND u.password=:pass",User.class);

इसके बाद प्रश्न:

Query query= em.createQuery("select u from User u where u.username=:usr AND u.password=:pass",User.class);

1

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

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);

    }
}

आशा है कि यह किसी की मदद करता है


1

मैं इस पैटर्न की सिफारिश करता हूं:

@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {    
    static final String PERSISTANCE_NAME = "USER";

    // Column definitions here

}

0

अपनी क्वेरी में आपको वर्ग नाम (उपयोगकर्ता) नहीं तालिका नाम (उपयोगकर्ता) का उपयोग करना होगा, इसलिए आपकी क्वेरी "उपयोगकर्ता से" है


0

आपको अपनी इकाई या वर्ग (केस संवेदनशील) के रूप में अपने चयनित क्वेरी में एक ही नाम लिखना होगा। यानी className / Entity नाम उपयोगकर्ता से उपयोगकर्ता का चयन करें;


0

के साथ org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users], आप usersतालिका से चयन करने का प्रयास कर रहे हैं । लेकिन आप अपनी कक्षा के साथ टिप्पणी कर रहे हैं @Table( name = "Users" )। तो या तो उपयोग करें users, या Users


0

यदि आप xml कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो आपको एक applicationContext.xml फ़ाइल में कुछ इस तरह की आवश्यकता होगी:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" lazy-init="default" autowire="default" dependency-check="default">
<property name="dataSource">
  <ref bean="dataSource" />
</property>
<property name="annotatedClasses">
  <list>
    <value>org.browsexml.timesheetjob.model.PositionCode</value>
  </list>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.