mysql Java Hibernate错误类未映射
我有一个产品数据库。我创建了一个简单的Hibernate项目,从数据库中检索所有产品。然而,我在编译代码时遇到了以下异常:
产品未映射
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped [SELECT p FROM Product p]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:350)
at databases.ProductsDB.getProducts(ProductsDB.java:36)
at runnable.TestDriver.main(TestDriver.java:14)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped [SELECT p FROM Product p]
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:342)
... 2 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:332)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3678)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3567)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
... 10 more
类产品确实被映射了——至少我是这么看的
MySQL数据库
mysql> describe products;
+---------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| prod_id | int(11) | NO | PRI | NULL | |
| prod_name | varchar(30) | NO | | NULL | |
| prod_price | decimal(10,2) | NO | | NULL | |
| prod_category | char(5) | NO | | NULL | |
+---------------+---------------+------+-----+---------+-------+
Java类产品
@Entity(name = "products")
public class Product implements Serializable {
@Id
@Column(name = "prod_id", unique = true)
private int id;
@Column(name = "prod_name", nullable = false)
private String name;
@Column(name = "prod_price", nullable = false)
private BigDecimal price;
@Column(name = "prod_category", nullable = false)
private String category;
//skipping the constructor, setters and getters
}
。xml文件
<persistence-unit name="Products_manager" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>products.Product</class>
受影响的方法
public static List<Product> getProducts() {
EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
String query = "SELECT p FROM Product p WHERE p.id IS NOT NULL";
TypedQuery<Product> tq = em.createQuery(query, Product.class);
List<Product> products;
try {
products = tq.getResultList();
return products;
}
catch(NoResultException e) {
e.printStackTrace();
}
finally {
em.close();
}
return null;
}
令人惊讶的是,将prodcuts添加到数据库中效果很好
# 1 楼答案
为了验证表名应该是“product”还是“products”,下面是可以做的事情
使用线下休眠设置
这将自动在testdb中创建表。这将帮助你理解“产品”或“产品”是否正确
必须改成
# 2 楼答案
此名称用于指代查询中的实体
试试看
# 3 楼答案
如果像这样声明实体类,代码将正常工作:
为了更好地理解,你可以看看name attribute in @Entity and @Table