Próbuję uzyskać listę wszystkich użytkowników z tabeli „użytkownicy” i otrzymuję następujący błąd:
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)
Oto kod, który napisałem, aby dodać / pobrać 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 konfiguracyjny hibernacji:
<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>
a 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;
}
...
}
Masz jakiś pomysł, dlaczego otrzymuję ten błąd?
Odpowiedzi:
W języku HQL należy użyć nazwy klasy java i nazwy właściwości mapowanej
@Entity
zamiast rzeczywistej nazwy tabeli i nazwy kolumny, więc HQL powinien być:Aktualizacja: Aby być bardziej precyzyjnym, należy użyć nazwy jednostki skonfigurowanej w programie,
@Entity
aby odwołać się do „tabeli”, która domyślnie jest niekwalifikowaną nazwą zmapowanej klasy Java, jeśli nie ustawisz jej jawnie.(PS Tak,
@javax.persistence.Entity
ale nie@org.hibernate.annotations.Entity
)źródło
Na przykład: nazwa Twojej klasy bean to UserDetails
Nie podajesz nazwy swojego stołu na Db. podajesz nazwę klasy fasola .
źródło
Chcę tylko podzielić się moim odkryciem. Nadal pojawia się ten sam błąd, nawet jeśli zapytanie dotyczyło poprawnej nazwy klasy. Później zdałem sobie sprawę, że importuję klasę Entity z niewłaściwego pakietu.
Problem został rozwiązany po zmianie linii importu z:
do
źródło
Dodano
@TABLE(name = "TABLE_NAME")
adnotację i naprawiono. Sprawdź swoje adnotacje i plik hibernate.cfg.xml. Oto przykładowy plik encji, który działa:źródło
Istnieje możliwość, że zapomniałeś dodać mapowanie dla utworzonej jednostki do tego
hibernate.cfg.xml
samego błędu.źródło
Oznacza to, że hibernacja nie rozpoznaje
User
jednostki jako „użytkowników”.@Table
Adnotacja ustawia stół nazwy być „Użytkownicy”, ale nazwa jest nadal żywa, o których mowa w HQL jako „Użytkownik”.Aby zmienić oba, należy ustawić nazwę podmiotu:
Zobacz moją odpowiedź tutaj, aby uzyskać więcej informacji: Błąd mapowania tabeli hibernacji
źródło
Upewnij się również, że w konfiguracji ziaren hibernacji jest ustawiona następująca właściwość:
To mówi wiosnie i hibernacji, gdzie znaleźć klasy domeny oznaczone jako jednostki.
źródło
Niektóre instalacje MySQL oparte na systemie Linux wymagają rozróżniania wielkości liter. Obejście polega na zastosowaniu
nativeQuery
.źródło
Również importowałem niewłaściwą jednostkę.
import org.hibernate.annotations.Entity;
Powinien to być importjavax.persistence.Entity;
źródło
Sprawdź również, czy dodałeś klasę z adnotacjami, używając:
new Configuration().configure("configuration file path").addAnnotatedClass(User.class)
To zawsze marnowało mój czas podczas dodawania nowej tabeli do bazy danych za pomocą Hibernate.
źródło
createQuery
Otrzymałem ten sam błąd, gdy Spring z hibernacją .. Użyłem "user" w mojej instrukcji, a moja klasa to User ... Więc zmieniłem ją na User w moim zapytaniu i problem został rozwiązany.Zapytanie przed:
Zapytanie po:
źródło
Wystąpił ten problem, gdy zastąpiłem starą bibliotekę hibernate-core na hibernate-core-5.2.12. Jednak cała moja konfiguracja była w porządku. I naprawiłem ten problem, tworząc sessionfactory w ten sposób:
Mam nadzieję, że to komuś pomoże
źródło
Polecam ten wzór:
źródło
W swoim zapytaniu musisz użyć nazwy klasy (użytkownik), a nie nazwy tabeli (użytkownicy), więc twoje zapytanie jest „od użytkownika”
źródło
W zapytaniu wybierającym należy wpisać tę samą nazwę, co jednostka lub klasa (z uwzględnieniem wielkości liter). tj. wybierz użytkownika z className / Entity Name user;
źródło
z
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
, próbujesz wybrać zusers
tabeli. Ale dodajesz do swojej klasy adnotację@Table( name = "Users" )
. Więc albo użyjusers
, alboUsers
.źródło
Jeśli używasz konfiguracji XML, będziesz potrzebować czegoś podobnego do następującego w pliku applicationContext.xml:
źródło