“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-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;
}
...
}
이 오류가 발생하는 이유는 무엇입니까?
답변
HQL 에서 실제 테이블 이름 및 열 이름 대신 맵핑 된 Java 클래스 이름 및 특성 이름 을 @Entity
사용해야하므로 HQL은 다음과 같아야합니다.
List<User> result = session.createQuery("from User", User.class).getResultList();
보다 정확한 설명 @Entity
을 위해, “table”을 참조 하도록 구성된 엔티티 이름을 사용해야합니다 . 명시 적으로 설정하지 않으면 매핑 된 Java 클래스 의 규정되지 않은 이름이 기본값 으로 사용됩니다.
(PS 그것은 @javax.persistence.Entity
아니지만 @org.hibernate.annotations.Entity
)
답변
예를 들어, Bean 클래스 이름은 UserDetails입니다.
Query query = entityManager. createQuery("Select UserName from **UserDetails** ");
Db에 테이블 이름을 지정하지 마십시오. bean의 클래스 이름을 제공합니다 .
답변
내 결과를 공유하기 위해 쿼리가 올바른 클래스 이름을 타겟팅하더라도 여전히 같은 오류가 발생했습니다. 나중에 잘못된 패키지에서 Entity 클래스를 가져오고 있음을 깨달았습니다.
가져 오기 줄을 다음과 같이 변경하면 문제가 해결되었습니다.
import org.hibernate.annotations.Entity;
에
import javax.persistence.Entity;
답변
@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;
}
}
답변
생성 된 엔터티에 대한 매핑을 hibernate.cfg.xml
같은 오류 에 추가하지 않았을 수 있습니다 .
답변
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
이것은 최대 절전 모드가 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{
자세한 내용은 여기 내 대답을 참조하십시오 : 최대 절전 모드 테이블이 매핑되지 않았습니다.
답변
또한 최대 절전 모드 Bean 구성에 다음 특성이 설정되어 있는지 확인하십시오.
<property name="packagesToScan" value="yourpackage" />
이것은 엔티티로 주석이 달린 도메인 클래스를 찾을 위치를 봄과 최대 절전 모드에 알려줍니다.
