【问题标题】:Why does this JPQL syntax exception occur?为什么会出现这个 JPQL 语法异常?
【发布时间】:2017-07-21 13:31:15
【问题描述】:

异常错误代码

EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
TypedQuery<Member> query = em.createQuery("select m from Member m",Member.class);
List<Member> memberList = query.getResultList();

实体类

@Entity
@Table(name="MEMBER")
public class Member {
    @Id
    @Column(name="MEMBER_ID")
    private String id;
    @Column(name="USERNAME")
    private String username;
    @ManyToOne
    @JoinColumn(name="TEAM_ID", referencedColumnName = "TEAM_ID")
    private Team team;

    public Member() {
    }

    public Member(String id, String username) {
        this.id = id;
        this.username = username;
    }

    public String getId() {
        return id;
    }

    public Member setId(String id) {
        this.id = id;
        return this;
    }

    public String getUsername() {
        return username;
    }

    public Member setUsername(String username) {
        this.username = username;
        return this;
    }

    public Team getTeam() {
        return team;
    }

    public Member setTeam(Team team) {
        this.team = team;
        team.getMembers().add(this);
        return this;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                ", team=" + team +
                '}';
    }

}

异常信息

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: Member near line 1, column 15 [select m from Member m]

pom.xml

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.10.Final</version>
</dependency>

我不知道为什么会出现这个异常,因为语法看起来不错。我们正在使用 jpa 作为团队项目。但上述问题只针对部分团队成员。不知道是什么环境影响了这样的异常。

我知道 Hibernate 支持 JPQL 标准。

【问题讨论】:

  • stackoverflow.com/questions/33808306/…。你试试这个。你应该省略。选择米
  • 看起来您的 Member 类未映射。向我们展示您的映射配置。
  • @talex 除了Entity Class的注解还需要什么映射?
  • 我想你使用Spring。您应该配置 AnnotationSessionFactoryBean 或类似的东西。看这个教程journaldev.com/3524/…
  • @talex 不,我没有使用 Spring 框架。 Java EE 模块的 Web 应用程序。

标签: java jpa


【解决方案1】:

我不知道原因,但我解决了问题。问题是必须在包中声明实体类。如果实体类在默认包中声明,JPQL 将无法识别它。如果您知道问题的原因,我将不胜感激您的 cmets。

【讨论】:

    【解决方案2】:
    TypedQuery<Member> query = em.createQuery("from Member");
    

    你试试看。不要使用 select m 子句。

    【讨论】:

    • 发生同样的异常。 :(
    • List result = (List) session.createQuery("from Member").list();
    • JPQL 需要“SELECT m”,请查看 JPA 规范。您建议用户使用无效的 JPA 语法(即特定于 Hibernate)
    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多