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

时间:2013-11-25 12:50:03

标签: java jpa persistence jpql

我正在开发一个带有数据库连接的游戏,我使用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<Human, Boolean> 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,它工作得非常好并且还获得了建筑实体:

public class HumanDAO implements DAO<Human> {

// ...
public List<Human> getAllHumans() {
    TypedQuery<Human> 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

7 个答案:

答案 0 :(得分:23)

你应该

SELECT g FROM Game g//you have game

但您有game而不是Game

@Table注释用于DB。

如果您需要更改JPQL中的名称,请使用@Entity注释:@Entity(name="nameUsedInJPQL") => nameUsedInJPQL is used in your JPQL.

如果您未在@Entity中指定任何内容,则使用区分大小写的实体类名称。

答案 1 :(得分:8)

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

答案 2 :(得分:3)

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

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

在GF附带的EclipseLink版本中,似乎尚未支持Java 8的任何功能。更多信息,请参阅the bug report on that.

希望这有帮助。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果你在一个bundle中调用persistence.xml,那么org.eclipse.persistence.jpa必须在你的bundle(或多个bundle)之前启动。如果没有,您将得到相同的异常。您还将看到这些表尚未在您的数据库中创建。因此,始终将 org.eclipse.persistence 作为导入包添加到清单中是个好主意。