Lỗi ngủ đông - QuerySyntaxException: người dùng không được ánh xạ [từ người dùng]


126

Tôi đang cố gắng lấy danh sách tất cả người dùng từ bảng "người dùng" và tôi gặp lỗi sau:

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)

Đây là mã tôi đã viết để thêm / nhận người dùng:

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

Thêm người dùng hoạt động, nhưng khi tôi sử dụng chức năng getUsers, tôi gặp phải những lỗi này.

Đây là tập tin cấu hình ngủ đông của tôi:

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

và đây là lớp Người dùng của tôi:

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

Bất cứ ý tưởng tại sao tôi nhận được lỗi này?


Câu trả lời:


297

Trong HQL, bạn nên sử dụng tên lớp javatên thuộc tính của ánh xạ @Entitythay vì tên bảng và tên cột thực tế, vì vậy HQL phải là:

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

Cập nhật: Để chính xác hơn, bạn nên sử dụng tên thực thể được cấu hình @Entityđể tham chiếu đến "bảng", mặc định là tên không đủ tiêu chuẩn của lớp java được ánh xạ nếu bạn không đặt rõ ràng.

(PS @javax.persistence.Entitynhưng không phải @org.hibernate.annotations.Entity)


10
Vì vậy, thực sự điều này thậm chí là trường hợp nhạy cảm. vì vậy "từ người dùng" sẽ dẫn đến ngoại lệ tương tự
tObi

3
Đó là một phần của câu trả lời, nhưng để giải quyết lỗi, tôi đã phải sử dụng đường dẫn đối tượng đầy đủ như thế này: [...]. CreatQuery ("từ gcv.metier.User as u where u.username =?")
Raphael

Tôi cũng đã phải sử dụng toàn bộ đường dẫn, có lẽ JPA có vấn đề với từ "Người dùng"? Tôi đoán đó là một từ dành riêng trong một vài triển khai DB. Trong thực tế, vấn đề này chỉ xuất hiện từ tôi khi tôi đổi tên bảng db đó từ người dùng thành the_user (một phần của việc khắc phục sự cố khác) trước khi JPA ổn.
Michael Coxon

1
bạn có thể vui lòng cập nhật danh sách () thành getResultList () như trước đây không được dùng nữa không?
Durja Arai

31

Ví dụ: tên lớp bean của bạn là UserDetails

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

Bạn không cho biết tên bảng của bạn trên Db. bạn cho tên lớp của đậu .


12

Chỉ để chia sẻ phát hiện của tôi. Tôi vẫn gặp lỗi tương tự ngay cả khi truy vấn đang nhắm đúng tên lớp. Sau này tôi nhận ra rằng tôi đang nhập lớp Thực thể từ gói sai.

Vấn đề đã được giải quyết sau khi tôi thay đổi dòng nhập từ:

import org.hibernate.annotations.Entity;

đến

import javax.persistence.Entity;

Bây giờ điều này đã cứu tôi thực sự.
Anirudh

9

Đã thêm @TABLE(name = "TABLE_NAME")chú thích và cố định. Kiểm tra các chú thích và tệp hibernate.cfg.xml của bạn. Đây là tệp thực thể mẫu hoạt động:

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

Có khả năng bạn đã quên thêm ánh xạ cho Thực thể được tạo vào hibernate.cfg.xml, cùng một lỗi.


Tôi cũng quên không thêm lớp POJO trong hibernate.cfg.xml.
Chinmoy

6

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

Điều này chỉ ra rằng ngủ đông không biết Userthực thể là "người dùng".

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

Các @Tablechú thích đặt bảng tên là "Người dùng" nhưng tên thực thể vẫn được đề cập trong HQL là "tài khoản".

Để thay đổi cả hai, bạn nên đặt tên của thực thể:

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

Xem câu trả lời của tôi ở đây để biết thêm: Bảng Hibernate không được ánh xạ lỗi


5

Đồng thời đảm bảo rằng thuộc tính sau được đặt trong cấu hình bean ngủ đông của bạn:

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

Điều này cho biết mùa xuân và ngủ đông nơi tìm các lớp miền của bạn được chú thích dưới dạng các thực thể.


5

Một số cài đặt MySQL dựa trên Linux yêu cầu phân biệt chữ hoa chữ thường. Làm việc xung quanh là để áp dụng nativeQuery.

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

1
Bạn có chắc chắn "MySQL dựa trên Linux" có vai trò ở đây không?
vào

3

Tôi cũng đã nhập sai Thực thể. import org.hibernate.annotations.Entity; Nó nên nhậpjavax.persistence.Entity;


3

Đồng thời kiểm tra xem bạn đã thêm lớp chú thích bằng cách sử dụng:

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

Điều đó luôn lãng phí thời gian của tôi khi thêm một bảng mới vào cơ sở dữ liệu bằng Hibernate.


2

Tôi đã gặp lỗi tương tự trong khi Spring với hibernate..Tôi đang sử dụng "user" bằng chữ thường trong createQuerycâu lệnh của mình và lớp của tôi là User..Vậy đã thay đổi nó thành User trong truy vấn của tôi và vấn đề đã được giải quyết.

Truy vấn trước:

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

Truy vấn sau:

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

1

Tôi gặp vấn đề này khi thay thế thư viện hibernate-core cũ bằng hibernate-core-5.2.12. Tuy nhiên tất cả các cấu hình của tôi là ok. Và tôi đã khắc phục vấn đề này bằng cách tạo sessionfactory theo cách này:

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

    }
}

Hy vọng nó sẽ giúp được ai đó


1

Tôi đề nghị mô hình này:

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

    // Column definitions here

}

0

Trong Truy vấn của bạn, bạn phải sử dụng tên lớp (Người dùng) chứ không phải tên bảng (người dùng) để truy vấn của bạn là "từ Người dùng"


0

Bạn phải nhập cùng tên trong truy vấn đã chọn làm thực thể hoặc lớp của bạn (phân biệt chữ hoa chữ thường). tức là chọn người dùng từ className / Entity Name user;


0

với org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users], bạn đang cố gắng chọn từ usersbảng. Nhưng bạn đang chú thích lớp của bạn với @Table( name = "Users" ). Vì vậy, hoặc sử dụng users, hoặc Users.


0

Nếu bạn đang sử dụng cấu hình xml, bạn sẽ cần một cái gì đó như sau trong tệp 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.