Error on compiling query: The abstract schema type 'entity' is unknown

匿名 (未验证) 提交于 2019-12-03 08:44:33

问题:

I'm developing a game with a database connection, and I use JPA to persist my data. Here is my Game entity :

@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;

And here is my Human entity :

@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;

To get the list of all the humans stored in the DB, I use this DAO, which is working very well and gets also the Building entity :

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(); }

The problem is when I try to do the same to get the list of all the games with the JPQL query SELECT g FROM game g, I get this error :

[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

回答1:

You should have

SELECT g FROM Game g//you have game

but you have game instead of Game.

The @Table annotation is used for DB. If you need to change the name in your JPQL, use the @Entity annotation: @Entity(name="nameUsedInJPQL") => nameUsedInJPQL is used in your JPQL. If you do not specify anything in your @Entity, that the case-sensitive Entity class name is used.



回答2:

In my case I forgot to register it in persistence.xml.



回答3:

I just had the very same situation but my JPQL query was correct ! It occured in Glassfish 4.1 (build 13) (with EclipseLink).

After a few googling and some code commenting, I found out that the root cause of "The abstract schema type 'MyEntity' is unknown" was some use of Java 8 lambda code inside the entity class.

It seems that any feature of Java 8 is not (yet) supported in the version of EclipseLink that comes with GF. More info, see the bug report on that.

Hope this helps.



回答4:

The name to be used for JPQL queries is defined as the simple name of the entity class - Game or Human in your case. It can be overridden by the name attribute of the @Entity annotation. @Table is a physical mapping annotation and does not influence the entity name in the query.

It does work with human because the query string is not case-sensitive.



回答5:

class name should be there not the table name in your query SELECT g FROM Game g



回答6:

We got the problem due to an update of org.eclipse.persistence.eclipselink library from 2.4.0 to 2.5.1. After updating to 2.6.2 it works again.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!