我正在尝试从“users”表中获取所有用户的列表,我收到以下错误:
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>
这是我的用户类:
@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;
}
...
}
知道我为什么会收到这个错误吗?
答案 0 :(得分:268)
在HQL中,您应该使用映射的@Entity
的 java类名和属性名,而不是实际的表名和列名,所以HQL应该是:
List<User> result = (List<User>) session.createQuery("from User").list();
答案 1 :(得分:24)
例如:您的bean类名称是 UserDetails
Query query = entityManager. createQuery("Select UserName from **UserDetails** ");
您不会在Db上提供您的表名。 你给出了bean的类名。
答案 2 :(得分:12)
只是为了分享我的发现。即使查询的目标是正确的类名,我仍然会遇到相同的错误。后来我意识到我从错误的包中导入了Entity类。
我从以下位置更改导入行后问题得以解决:
import org.hibernate.annotations.Entity;
到
import javax.persistence.Entity;
答案 3 :(得分:9)
添加@TABLE(name = "TABLE_NAME")
注释并修复。检查您的注释和hibernate.cfg.xml文件。这是有效的示例实体文件:
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;
}
}
答案 4 :(得分:6)
某些基于Linux的MySQL安装需要区分大小写。解决方法是应用nativeQuery
。
@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)
答案 5 :(得分:6)
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
这表明hibernate不知道User
实体是“用户”。
@javax.persistence.Entity
@javax.persistence.Table(name = "Users")
public class User {
@Table
注释将表名称设置为“用户”,但实体名称仍在HQL中称为“用户”。
要更改两者,您应该设置实体的名称:
// this sets the name of the table and the name of the entity
@javax.persistence.Entity(name = "Users")
public class User implements Serializable{
有关详情,请参阅我的回答:Hibernate table not mapped error
答案 6 :(得分:5)
还要确保在hibernate bean配置中设置了以下属性:
<property name="packagesToScan" value="yourpackage" />
这告诉spring和hibernate在哪里找到注释为实体的域类。
答案 7 :(得分:5)
您可能忘记将创建的实体的映射添加到hibernate.cfg.xml
,同样的错误。
答案 8 :(得分:3)
还要检查是否使用以下方法添加了带注释的类:
new Configuration().configure("configuration file path").addAnnotatedClass(User.class)
使用Hibernate在数据库中添加新表时,总是浪费我的时间。
答案 9 :(得分:2)
我也导入了错误的实体import org.hibernate.annotations.Entity;
它应该是导入javax.persistence.Entity;
答案 10 :(得分:1)
当我用hibernate-core-5.2.12替换旧的hibernate-core库时,我遇到了这个问题。但是我的所有配置都没问题。我通过这种方式创建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);
}
}
希望它有助于某人
答案 11 :(得分:1)
使用Spring休眠时,我遇到相同的错误。.我在createQuery
语句中使用小写字母的“ user”,而我的班级是User.。因此在查询中将其更改为User,问题是解决。
之前查询:
Query query= em.createQuery("select u from user u where u.username=:usr AND u.password=:pass",User.class);
查询之后:
Query query= em.createQuery("select u from User u where u.username=:usr AND u.password=:pass",User.class);
答案 12 :(得分:1)
我推荐这种模式:
@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {
static final String PERSISTANCE_NAME = "USER";
// Column definitions here
}
答案 13 :(得分:0)
在查询中,您必须使用类名(用户)而不是表名(用户) 所以你的查询是 “来自用户”
答案 14 :(得分:0)
您必须在选择查询中输入与实体或类相同的名称(区分大小写)。即从className / Entity Name用户中选择用户;
答案 15 :(得分:0)
使用org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
,您正在尝试从users
表中进行选择。但是您正在用@Table( name = "Users" )
注释您的班级。因此,请使用users
或Users
。
答案 16 :(得分:0)
如果使用xml配置,则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>
答案 17 :(得分:0)
在使用Quarkus微服务框架时,我也遇到了这个问题:
public class SomeResource {
@GET
@RolesAllowed({"basic"})
public Response doSomething(@Context SecurityContext context) {
// ...
}
}
// this will generate an QuerySyntax exception, as the authorization module
// will ignore the Entity annotation and use the class name instead.
@Entity(name = "users")
@UserDefinition
public class User {
// ...
}
// do this instead
@Entity
@Table(name = "users")
@UserDefinition
public class User {
// ...
}
答案 18 :(得分:0)
在Spring项目中:
我输入了错误的CODEPIPELINE
并收到此错误。
现在运行良好。