Hazırda bekletme hatası - QuerySyntaxException: kullanıcılar eşlenmedi [kullanıcılardan]


126

"Kullanıcılar" tablosundan tüm kullanıcıların bir listesini almaya çalışıyorum ve aşağıdaki hatayı alıyorum:

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)

Kullanıcı eklemek / almak için yazdığım kod bu:

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

Kullanıcı eklemek işe yarıyor, ancak getUsers işlevini kullandığımda bu hatayı alıyorum.

Bu benim hazırda bekletme yapılandırma dosyam:

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

ve bu benim Kullanıcı sınıfım:

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

Bu hatayı neden aldığım hakkında bir fikriniz var mı?


Yanıtlar:


297

HQL, kullanmak gerekir java sınıf adı ve özelliği adı eşlenen bir @EntityHQL olmalıdır böylece yerine gerçek tablo adı ve sütun adının:

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

Güncelleme: Daha kesin olmak gerekirse, içinde yapılandırılan varlık adını açıkça ayarlamazsanız @Entity, eşlenmiş java sınıfının nitelenmemiş adını varsayılan "tablo" olarak kullanmalısınız .

(PS Öyle @javax.persistence.Entityama değil @org.hibernate.annotations.Entity)


10
Yani aslında bu bile büyük / küçük harfe duyarlıdır. bu nedenle "kullanıcıdan" aynı istisnayla sonuçlanır
tObi

3
Bu cevabın bir parçası, ancak hatayı çözmek için tam nesne yolunu şu şekilde kullanmak zorunda kaldım: [...]. CreateQuery ("gcv.metier.User as u.username =?")
Raphael

Ayrıca tüm yolu kullanmak zorunda kaldım, belki JPA'nın "Kullanıcı" kelimesiyle bir sorunu var? Sanırım birkaç DB uygulamasında ayrılmış bir kelime. Aslında, bu sorun benden yalnızca o db tablosunu kullanıcıdan kullanıcı olarak yeniden adlandırdığımda (başka bir sorunu çözmenin bir parçası olarak) JPA iyi olmadan önce ortaya çıktı.
Michael Coxon

1
Birincisi kullanımdan kaldırıldığı için lütfen list () 'i getResultList () için güncelleyebilir misiniz?
Durja Arai

31

Örneğin: bean sınıfı adınız UserDetails

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

Tablonuzun adını Db'de vermiyorsunuz. fasulyenin sınıf adını veriyorsunuz .


12

Sadece bulduğumu paylaşmak için. Sorgu doğru sınıf adını hedeflese bile aynı hatayı alıyorum. Daha sonra Entity sınıfını yanlış paketten aldığımı fark ettim.

İçe aktarma satırını şuradan değiştirdikten sonra sorun çözüldü:

import org.hibernate.annotations.Entity;

için

import javax.persistence.Entity;

Şimdi bu beni gerçekten kurtardı.
Anirudh

9

@TABLE(name = "TABLE_NAME")Açıklama eklendi ve düzeltildi. Notlarınızı ve hibernate.cfg.xml dosyanızı kontrol edin. Bu, çalışan örnek varlık dosyasıdır:

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

Oluşturulan Varlık için eşlemeyi hibernate.cfg.xmlaynı hataya eklemeyi unutmuş olabilirsiniz .


Hibernate.cfg.xml içine POJO sınıfını eklemeyi de unuttum.
Chinmoy

6

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

Bu, hazırda bekletmenin Uservarlığı "kullanıcılar" olarak tanımadığını gösterir .

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

@TableEk açıklama setleri tablo "Kullanıcılar" ama varlık adı hala "Kullanıcı" olarak HQL içinde anılır olmaya adını.

İkisini de değiştirmek için varlığın adını belirlemelisiniz:

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

Daha fazla bilgi için cevabıma buradan bakın: Hazırda bekleme tablosu eşleşmedi hatası


5

Ayrıca, hazırda bekletme fasulye konfigürasyonunuzda aşağıdaki özelliğin ayarlandığından emin olun:

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

Bu, ilkbahar ve hazırda bekletme moduna, varlık olarak ek açıklamalı alan sınıflarınızı nerede bulacağınızı söyler.


5

Bazı Linux tabanlı MySQL kurulumları büyük / küçük harfe duyarlı gerektirir. Çözüm, uygulamaktır nativeQuery.

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

1
"Linux tabanlı MySQL" in burada bir rolü olduğundan emin misiniz?
2017

3

Ayrıca yanlış Varlığı ithal ediyordum. İçe import org.hibernate.annotations.Entity; aktarılmalıjavax.persistence.Entity;


3

Ayrıca şunları kullanarak ek açıklamalı sınıfı ekleyip eklemediğinizi kontrol edin:

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

Bu, Hibernate kullanarak veritabanına yeni bir tablo eklerken her zaman zamanımı boşa harcadı.


2

Spring hazırda bekletme createQuerymodunda iken ben de aynı hatayı alıyordum ... İfademde küçük harfle "user" kullanıyordum ve sınıfım User idi ... Bu yüzden sorgumda User olarak değiştirildi ve problem çözüldü.

Önceden sorgu:

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

Sonrasında sorgu:

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

1

Bu sorunu, eski hazırda bekletme çekirdek kitaplığını hazırda bekletme çekirdeği-5.2.12 ile değiştirdiğimde aldım. Ancak tüm konfigürasyonum iyiydi. Ve bu sorunu şu şekilde sessionfactory oluşturarak düzelttim:

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

    }
}

Umarım birine yardımcı olur


1

Bu kalıbı tavsiye ederim:

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

    // Column definitions here

}

0

Sorgunuzda tablo adı (kullanıcılar) değil sınıf adı (Kullanıcı) kullanmanız gerekir, böylece sorgunuz "Kullanıcıdan" olur


0

Seçim sorgunuzda varlığınız veya sınıfınızla aynı adı yazmanız gerekir (büyük / küçük harfe duyarlı). yani, sınıfAdı / Varlık Adı kullanıcısından kullanıcı seçin;


0

ile tablodan org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]seçim yapmaya çalışıyorsunuz users. Ama sınıfınıza not ekliyorsunuz @Table( name = "Users" ). Yani users, veya kullanın Users.


0

Xml yapılandırması kullanıyorsanız, bir applicationContext.xml dosyasında aşağıdakine benzer bir şeye ihtiyacınız olacaktır:

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.