我试图从“用户”表中获取所有用户的列表,但出现以下错误:
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(); }
添加用户是可行的,但是当我使用getUsers函数时,出现这些错误。
这是我的hibernate配置文件:
<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>
这是我的User类:
@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; } ... }
知道为什么我会收到此错误吗?
在HQL中,应使用映射的 Java类名 和 属性名 ,@Entity而不是实际的表名和列名,因此HQL应该为:
@Entity
List<User> result = session.createQuery("from User", User.class).getResultList();
更新:更精确地说,您应该使用在中配置的实体名称@Entity来引用“表”,如果未明确设置,则默认为映射的 Java类的 非限定名称。
(PS是@javax.persistence.Entity但不是@org.hibernate.annotations.Entity)
@javax.persistence.Entity
@org.hibernate.annotations.Entity