web-dev-qa-db-ja.com

クエリのコンパイル時のエラー:抽象スキーマタイプ 'エンティティ'が不明です

データベース接続を使用してゲームを開発しています。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;

DBに保存されているすべての人間のリストを取得するには、このDAOを使用します。このDAOは非常にうまく機能し、Buildingエンティティも取得します。

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
16
Mohamed Amine

あなたが持っているべきです

_SELECT g FROM Game g//you have game
_

ただし、gameではなくGameがあります。

_@Table_アノテーションはDBに使用されます。

JPQLの名前を変更する必要がある場合は、_@Entity_アノテーションを使用します:@Entity(name="nameUsedInJPQL") => nameUsedInJPQL is used in your JPQL.

_@Entity_で何も指定しない場合は、大文字と小文字を区別するエンティティクラス名が使用されます。

26
Andrei I

私の場合、persistence.xmlに登録するのを忘れていました。

15
leomeurer

まったく同じ状況でしたが、JPQLクエリは正しかったです! Glassfish 4.1(ビルド13)(EclipseLink)で発生しました。

いくつかのグーグルといくつかのコードのコメントの後、「The abstract schema type 'MyEntity' is unknown」の根本的な原因はであることがわかりましたエンティティクラス内のJava 8ラムダコードの使用

Java 8の機能は、GFに付属するEclipseLinkのバージョンでは(まだ)サポートされていません。詳細については、 バグレポートを参照してください。

お役に立てれば。

3
user1853859

クラス名は、クエリにテーブル名が含まれていない必要がありますSELECT g FROM Game g

2
Manish Kr

JPQLクエリに使用される名前は、エンティティクラスの単純な名前として定義されます-場合はGameまたはHuman@Entityアノテーションのname属性でオーバーライドできます。 @Tableは物理マッピングアノテーションであり、クエリのエンティティ名には影響しません。

クエリ文字列では大文字と小文字が区別されないため、humanでは機能します。

2
kostja

Org.Eclipse.persistence.eclipselinkライブラリを2.4.0から2.5.1に更新したため、問題が発生しました。 2.6.2にアップデートすると、再び機能します。

0
ulrich