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 不适用于“会员”实体的主要内容,如果未能解决你的问题,请参考以下文章