2012-03-31 12 views
87

Próbuję uzyskać listę wszystkich użytkowników z „użytkownicy” stół i pojawia się następujący błąd:Hibernate błędach - QuerySyntaxException: użytkownicy nie są odwzorowywane [od użytkowników]

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) 

To Kod Napisałem, aby dodać/uzyskać użytkowników:

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

Dodawanie użytkowników działa, ale kiedy używam funkcji getUsers, pojawia się ten błąd.

To jest mój plik hibernacji config:

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

i to jest moja klasa użytkownika:

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

Każdy pomysł, dlaczego ten błąd?

+1

Related to: http://stackoverflow.com/questions/14446048/hibernate-table-not-mapped-error – Gray

Odpowiedz

211

W HQL, należy użyć nazwy klasy Java i nazwy właściwości z odwzorowanym @Entity zamiast rzeczywistej nazwy tabeli i kolumny nazwy, więc HQL powinno być:

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

Więc w rzeczywistości jest to nawet wrażliwe na wielkość liter. więc "od użytkownika" spowodowałoby ten sam wyjątek – tObi

+1

Jest to część odpowiedzi, ale w celu rozwiązania błędu musiałem użyć pełnej ścieżki obiektu w następujący sposób: [...]. createQuery ("from gcv.metier.User jak u gdzie u.username =? ") – Raphael

11

Wystarczy podzielić się moim ustalenia . Wciąż mam ten sam błąd, nawet jeśli zapytanie dotyczyło prawidłowej nazwy klasy. Później zorientowałem się, że importuję klasę Entity z niewłaściwej paczki.

Problem ten został rozwiązany za zmienić linii importu z:

import org.hibernate.annotations.Entity; 

do

import javax.persistence.Entity; 
+0

Jego praca dla mnie. – PKTomar

7

Dodano @TABLE(name = "TABLE_NAME") adnotacją i stałe. Sprawdź adnotacje i plik hibernate.cfg.xml. Jest to plik przykładowy, że jednostka działa:

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

Należy rozważyć przycinanie przykładowego kodu. – Gray

4

Istnieje możliwość zapomniałeś dodać mapowanie do utworzonego podmiotu do hibernate.cfg.xml, ten sam błąd.

+0

Również zapomniałem dodać klasę POJO w hibernate.cfg.xml. – Chinmoy

13

Na przykład: Twój fasoli nazwa klasy jest UserDetails

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

Nie nadać nazwę tabeli na DB. Podaj nazwę fasoli klasy.

2

ja również importuje złą Podmiot import org.hibernate.annotations.Entity; Powinno być import javax.persistence.Entity;

5

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

Oznacza to, że hibernacja nie zna podmiot User jako „użytkownicy”.

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

@Table adnotacja ustawia stołowego nazwy być „Użytkownicy”, ale nazwa jest nadal żywa, o których mowa w HQL jako „Użytkownik”.

Aby zmienić obie, należy ustawić nazwę podmiotu:

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

zobaczyć moją odpowiedź tutaj, aby uzyskać więcej informacji: Hibernate table not mapped error

3

także sprawdzić, czy dodał uwagami klasy przy użyciu:

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

To zawsze zmarnowało mój czas podczas dodawania nowej tabeli do bazy danych przy użyciu Hibernate.

5

Również upewnić się, że nieruchomość znajduje się w konfiguracji fasoli hibernacji:

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

Mówi sprężynę i hibernacji, gdzie znaleźć swoje klasy domen adnotacją podmiotów.

5

Niektóre instalacje MySQL oparte na systemie Linux wymagają uwzględnienia wielkości liter. Obracaj się, aby zastosować nativeQuery.

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

czy jesteś pewien, że "Linux-based MySQL" odgrywa tutaj rolę? – asgs

0

Mam ten problem, gdy zastąpiłem starą bibliotekę hibernacji z hibernate-core-5.2.12. Jednak cała moja konfiguracja była w porządku. I naprawiłem ten problem, tworząc w ten sposób: 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); 

    } 
} 

nadzieję, że ktoś pomoże

Powiązane problemy