我在下面设计了两个实体“会员”和“董事会”。
@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则没有。程序打印异常即意外令牌:成员。 JPQL是否没有策略支持实体名称包含一些特定的字符串,如“Member”?我无法理解这个异常消息。
我附上了在运行时上面代码中打印的异常消息。
=============================================== ===========================
我解决了这个问题。会员类和Board类在默认包中,我移入了一些包。
但是为什么JPQL在默认包中不完整?
答案 0 :(得分:1)
我认为Query on Member类最初返回错误的原因是什么 -
当您将应用程序放入@Entity
包时,您的应用程序未扫描Member
类上的default
注释。当您尝试在Member
课程上运行JPQL时,Hibernate
会查找jpqlMember
的映射,并且会因为未扫描该类而抛出QuerySyntaxException
,并且它不会能够找到一个。
稍后当您将其移至存在Board
类的同一个包时,它会成功扫描您的Member
类,并且您的查询已执行且没有任何错误。
如果在配置packagesToScan="com.app.models"
bean时设置sessionFactory
属性,则需要确保该包中存在所有实体。