【问题标题】:Hibernate Entity Manager - QuerySyntaxException: FooBar is not mappedHibernate Entity Manager - QuerySyntaxException:FooBar 未映射
【发布时间】:2020-12-02 11:18:05
【问题描述】:

我在尝试使用 EntityManager 执行查询时收到 org.hibernate.hql.internal.ast.QuerySyntaxException

我在 Java SE 应用程序中独立使用 Hibernate。我没有使用 XML 配置。

这就是我获取会话和 EntityManager 的方式(设置变量是 Map<String, String>):

StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder();
registryBuilder.applySettings(settings);
registry = registryBuilder.build();
MetadataSources sources = new MetadataSources(registry);
Metadata metadata = sources.getMetadataBuilder().build();
sessionFactory = metadata.getSessionFactoryBuilder().build();

Session session = sessionFactory.openSession();
EntityManager em = session.getEntityManagerFactory().createEntityManager();

这是我的实体类:

@Entity
@Table(name = "playeraccount")
public class PlayerAccount {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "playerId")
    private String playerId;
    @Column(name = "balance")
    private Double balance;

    [getters, setters...]
}

表SQL:

CREATE TABLE PlayerAccount (
    id BIGINT NOT NULL UNIQUE PRIMARY KEY,
    playerId VARCHAR(255) NOT NULL UNIQUE,
    balance DOUBLE NOT NULL DEFAULT 0.0
);

最后是查询:

TypedQuery<PlayerAccount> q = em.createQuery("SELECT a FROM PlayerAccount a WHERE a.playerId = :uuid", PlayerAccount.class);
q.setParameter("uuid", uuid);
PlayerAccount acc = q.getSingleResult();

整个例外是:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: PlayerAccount is not mapped [SELECT a FROM PlayerAccount a WHERE a.playerId = :uuid]

【问题讨论】:

  • 你的表名一样吗?
  • 你的桌子叫playeraccount,可以试试小机箱吗?选择一个 FROM 玩家帐号?
  • @SusanMustafa 小写时同样的错误。
  • 您的实体中定义的表是小案例 playeraccount,但您声明创建表 PlayerAccount 。因此,也要在您的 Entitylevel 上更改它,然后将 PlayerAccount 留在您的查询中。 @JakeS。
  • 等等....你没有映射班级? configuration.addAnnotatedClass(com.xyz.entities.PlayerAccount.class);

标签: java hibernate


【解决方案1】:

您的查询应该是: "SELECT * FROM playeraccount a WHERE a.playerId = :uuid"

【讨论】:

  • 还是一样的异常。我突然想到 MySQL 表名在 Windows 上不区分大小写。会不会有影响?
  • 按照上面的链接使用 XML 配置文件或以编程方式使 Hibernate 拾取您的实体进行映射。此外,您应该让 hibernate 为您创建表,而不是自己运行 SQL 以避免实体定义和 SQL 表中的任何不匹配。
【解决方案2】:
Configuration configuration = new Configuration();
EntityScanner.scanPackages("my.com.entities", "my.com.other.entities")
    .addTo(configuration);
SessionFactory sessionFactory = configuration.buildSessionFactory();

我错过了缺少 xml 的部分 :)

List<Class<?>> classes = EntityScanner
        .scanPackages("my.com.entities", "my.com.other.entities").result();

MetadataSources metadataSources = new MetadataSources();
for (Class<?> annotatedClass : classes) {
    metadataSources.addAnnotatedClass(annotatedClass);
}

SessionFactory sessionFactory = metadataSources.buildMetadata()
    .buildSessionFactory();

Can hibernate scan packages to create SessionFactory automatically?

【讨论】:

  • 正如我在问题中提到的,我没有使用 XML 配置。
  • @JakeS。你能试试上面的方法吗?映射您的包(其中包含您的实体)
【解决方案3】:

使用标准方法创建EntityManagerFactory,即:

Persistence.createEntityManagerFactory("PersistenceUnitName", settings)

如果愿意,您可以将其转换或解包到 SessionFactory。此外,请确保 persistence.xml 包含实体类的 FQN。如果您想使用 Hibernate 原生 API,也可以按照以下教程进行操作:https://docs.jboss.org/hibernate/orm/current/quickstart/html_single/#tutorial_annotations

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多