JPA,Hibernate。 java.lang.IllegalStateException:没有节点的数据类型

时间:2014-01-30 20:35:26

标签: java hibernate jpa jpql

我有这堂课:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipo", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "")
@Table(name = "publicacao")
@NamedQuery(name = "findPubOrderByAutor", query = "SELECT publicacao FROM Publicacao pub JOIN pub.autores a WHERE a.id = :id ORDER BY pub.autores")})
public abstract class Publicacao {
    @Column(name = "autores", nullable = false)
    @ManyToMany(fetch = FetchType.EAGER)
    @OrderBy("nome")
    @JoinTable(name = "pub_autor",
    joinColumns = @JoinColumn(name = "autor_id"),
    inverseJoinColumns = @JoinColumn(name = "publicacao_id"))
    private List<Autor> autores;
}

我收到此错误:

java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode 

- [IDENT] IdentNode:&#39;&#39; Publicacao&#39;&#39; {originalText = Publicacao}

对于类

中的NamedQuery
"SELECT publicacao FROM Publicacao pub JOIN pub.autores a WHERE a.id = :id ORDER BY pub.autores"

如果我将Publicacao替换为Publicacao,我会得到同样的错误,但是对于......&#39;&#39; publicacao&#39;&#39; ...

Java 7 Hibernate 3.5.5 JPA 2.0(我认为)

如果我错过了一些重要信息,请告诉我。

我不知道该怎么做,因为它为表格和对象名称指出了同样的错误。

提前致谢。

2 个答案:

答案 0 :(得分:0)

ORDER BY pub.autores

这可能是例外的原因。按集合排序没有意义。

另一个问题是

SELECT publicacao

publicacao不是查询中定义的别名。您应该使用select pub代替。

此外,您不应在@Column上拥有autores注释。它是一个ManyToMany关联,因此不会映射为列。您还可以在inverseJoinColumns使用joinColumns,反之亦然。

答案 1 :(得分:0)

我认为问题仅在于使用未定义的别名。而不是写作 SELECT publicacaoSELECT pub

更改后的代码会看到这个,

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipo", discriminatorType =    DiscriminatorType.STRING)
@DiscriminatorValue(value = "")
@Table(name = "publicacao")
@NamedQuery(name = "findPubOrderByAutor", query = "SELECT pub FROM Publicacao pub JOIN pub.autores a WHERE a.id = :id ORDER BY pub.autores")})
public abstract class Publicacao {
    @Column(name = "autores", nullable = false)
    @ManyToMany(fetch = FetchType.EAGER)
    @OrderBy("nome")
    @JoinTable(name = "pub_autor", joinColumns = @JoinColumn(name = "autor_id"), inverseJoinColumns = @JoinColumn(name = "publicacao_id"))
    private List<Autor> autores;
}