MySQL JPA Mapping: “QuerySyntaxException: foobar is not mapped…”错误
当我们在使用Java Persistence API (JPA)与MySQL数据库进行数据交互时,可能会遇到以下错误信息:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: foobar is not mapped [SELECT f FROM foobar f WHERE ...]
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162)
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:1836)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)
... 104 more
这个错误通常会出现在使用以下代码时:
Query query = entityManager.createQuery("SELECT f FROM foobar f WHERE ...");
错误信息表明,所使用的实体类 “foobar” 没有被映射到数据库中。因此,需要进行MySQL JPA映射配置以解决这个问题。
阅读更多:MySQL 教程
MySQL JPA映射配置
首先,在pom.xml中添加以下依赖项:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.28.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.28.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
然后,在application.yml中添加以下配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydatabase
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: mypassword
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
其中:
url
– MySQL数据库连接URLdriver-class-name
– MySQL JDBC驱动程序类名称username
– 数据库用户名password
– 数据库密码show-sql
– 是否显示SQL语句ddl-auto
– Hibernate启动时DDL操作 (create, create-drop, validate, update)dialect
– 数据库方言
接下来,在实体类中添加注解以建立实体与数据库表之间的映射关系。例如:一个名为 “foobar” 的表可以用以下实体类来映射:
@Entity
@Table(name = "foobar")
public class Foobar {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/*其他属性和方法省略*/
}
最后,重新执行查询代码,此次查询应该能够成功执行。
总结
MySQL JPA映射是一个强大的工具,用于在Java应用程序中与MySQL数据库进行数据交互。通过正确的配置和映射实体类,我们可以避免出现 “QuerySyntaxException: foobar is not mapped” 的错误信息并顺利完成查询操作。