JPQL 不适用于“会员”实体

Posted

技术标签:

【中文标题】JPQL 不适用于“会员”实体【英文标题】:JPQL does not work on "Member" entity 【发布时间】:2016-03-05 10:13:03 【问题描述】:

我在下面设计了两个实体“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;

我创建了两个 JPQL 来在我的 Main 方法中选择表。

    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()
    );

第一个选择 Board 的 JPQL 工作正常,但其他 JPQL 不是。程序打印出意外令牌的异常:Member。 JPQL 是否没有政策支持实体名称包含某些特定字符串,例如“成员”?我无法理解此异常消息。

我附上了运行时上述代码期间打印的异常消息。

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

我解决了这个问题。 Member 类和 Board 类在默认包中,我移到了一些包中。

但是为什么 JPQL 在默认包中不能完全工作?

【问题讨论】:

MEMBER 是一个 JPQL 关键字,任何 JPA 文档都会告诉你。这就是为什么您可以使用“entityName”来引用您的实体,以便您使用非关键字。由于您将您的设置为“jpqlMember”,那么您应该使用该名称引用实体 @NeilStockton tnx 回答。但它似乎在不是默认包而是由我创建的包中工作正常。为什么 JPQL 的工作如此不完整? "JPQL" 不做任何事情,它只是查询的语言规范。您的 JPA 实现是正在执行(或不执行)操作,因此建议您将注意力转向 Hibernate。除此之外,您的列表显示您在这种情况下没有使用“jpqlMember”,因此它将失败。此外,您不需要作为第二个参数传入的实体类...这是默认值。 【参考方案1】:

我认为 Query on Member 类最初返回错误的原因 -

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

稍后,当您将其移动到存在 Board 类的同一个包中时,它会成功扫描您的 Member 类,并且您的查询被执行且没有任何错误。

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

【讨论】:

以上是关于JPQL 不适用于“会员”实体的主要内容,如果未能解决你的问题,请参考以下文章

8Manage CRM:消费升级下会员管理之路

中国元宇宙+赋能实体经济峰会暨中国民协元宇宙工委会员发布仪式

php 直接链接重定向(用于拆分测试会员链接)

500万已备好,亿万级会员红利也已开放

JPA JPQL简介

MYSQL的各个索引类型有啥区别?