JPQL 不适用于 "Member" 实体

JPQL does not work on "Member" entity

下面我设计了两个实体"Member"和"Board".

@Entity(name = "jpqlBoard")
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String title;
}

@Entity(name = "jpqlMember")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String title;
}

我在 Main 方法上创建了两个 JPQL 到 select 表。

    String jpql = "select b from jpqlBoard b";
    System.out.println(
            em.createQuery(jpql, Board.class).getResultList()
    );

    jpql = "select m from jpqlMember m";
    System.out.println(
            em.createQuery(jpql, Member.class).getResultList()
    );

第一个 JPQL 到 select 板工作正常,但其他 JPQL 不是。程序打印异常表示意外标记:成员。 JPQL 是否没有政策支持实体名称包含一些特定的字符串,例如 "Member"?我无法理解此异常消息。

我附上了在运行时上面的代码中打印的异常消息。

============================================= =============================

我解决了这个问题。成员 class 和董事会 class 在默认包中,我移到了某个包中。

但为什么 JPQL 在默认包中工作不完整?

我认为对成员 class 的查询最初返回错误的原因 -

当您将 Member class 放在 default 包中时,您的应用程序没有扫描 @Entity 注释。当您尝试 运行 Member class 上的 JPQL 时,Hibernate 将查找 jpqlMember 的映射,并将 QuerySyntaxException 作为 class 未扫描,将无法找到。

稍后,当您将它移动到 Board class 所在的同一个包时,它会成功扫描您的 Member class 并且您的查询得到执行而没有任何错误.

如果在配置 sessionFactory bean 时设置 packagesToScan="com.app.models" 属性,则需要确保所有实体都存在于该包中。