编译查询时出错:抽象模式类型“实体”未知

我正在开发一个带有数据库连接的游戏,我使用JPA来保存我的数据。 这是我的游戏实体:

@Entity @Table(name = "game") public class Game implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "game_id") private int id; @Column(name = "name") private String name; @Column(name = "nbTurns") private int nbTurns; @Column(name = "playedOn") @Temporal(TemporalType.TIMESTAMP) private Date playedOn; @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "game_humans", joinColumns = @JoinColumn(name = "game_id")) @MapKeyColumn(name = "human_id") @Column(name = "isDead") private Map humans; 

这是我的人类实体:

 @Entity @Table(name = "human") public class Human implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = "name") private String name; @OneToOne private Building building; 

为了获得存储在数据库中的所有人的列表,我使用这个DAO,它工作得非常好并且还获得了Building实体:

 public class HumanDAO implements DAO { // ... public List getAllHumans() { TypedQuery query = em.createQuery("SELECT h FROM human h ORDER BY h.name", Human.class); return query.getResultList(); } 

问题是,当我尝试使用JPQL查询SELECT g FROM game g获取所有游戏的列表时,我收到此错误:

 [EL Info]: 2013-11-25 13:40:27.761--ServerSession(1943119327)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b [EL Info]: connection: 2013-11-25 13:40:28.151--ServerSession(1943119327)--file:/Users/amine/Documents/workspace/ZombiesServer/target/classes/_ZombiesServer login successful [WARNING] java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: Exception Description: Problem compiling [SELECT g FROM game g]. [14, 18] The abstract schema type 'game' is unknown. at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1585) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1605) at com.amine.zombies.DAO.GameDAO.getAllGames(GameDAO.java:80) at com.amine.zombies.application.Application.main(Application.java:21) ... 6 more 

你应该有

 SELECT g FROM Game g//you have game 

但你有game而不是Game

@Table注释用于DB。 如果需要更改JPQL中的名称,请使用@Entity注释:@ Entity(name =“nameUsedInJPQL”)=> nameUsedInJPQL用于JPQL。 如果未在@Entity中指定任何内容,则使用区分大小写的Entity类名称。

在我的情况下,我忘了在persistence.xml中注册它。

我只是有相同的情况,但我的JPQL查询是正确的! 它出现在Glassfish 4.1(build 13)中(使用EclipseLink)。

经过一些谷歌搜索和一些代码评论后,我发现“ 抽象模式类型’MyEntity’未知 ”的根本原因是在实体类中使用了Java 8 lambda代码

似乎在Java附带的EclipseLink版本中(但尚未)支持Java 8的任何function。 更多信息,请参阅有关的错误报告。

希望这可以帮助。

用于JPQL查询的名称被定义为实体类的简单名称 – 在您的情况下为GameHuman 。 它可以被@Entity注释的name属性覆盖。 @Table是一个物理映射注释,不会影响查询中的实体名称。

它确实适用于human因为查询字符串不区分大小写。

类名应该不是查询中的表名SELECT g FROM Game g

由于更新了2.4.0到2.5.1的org.eclipse.persistence.eclipselink库,我们遇到了问题。 更新到2.6.2后,它再次起作用。