2017-11-29 8 views
1

JPAで基本的なCRUDデータベースを作成しようとしていますが、「読み取り」部分に固執しています。クライアントに関する情報を格納する2つのフィールドを持つクライアントテーブルが作成されていますが、何らかの理由で基本的なJPA TypedQueryが '無効な識別子'でヒットすることなく照会できないようです。私はここに創造のコードを持っていて、何も外れているようには見えません。ORA-00904 JPA EclipseLink 2.1で無効な識別子

create table Client (
cid NUMBER PRIMARY KEY, 
fname VARCHAR2(255) NOT NULL, 
lname VARCHAR2(255) NOT NULL, 
email VARCHAR2(255), 
phone VARCHAR2(255), 
address VARCHAR(255) NOT NULL, 
age number NOT NULL 
); 

そして、私はクラスを照会するために使用しているここのコード、それだけで基本的なTypedQueryです。

TypedQuery<Client> query = em.createQuery("SELECT a FROM Client a", Client.class); 
    List<Client> results = query.getResultList(); 

そして(フォーマットするためのスニペットに投げ込ま)出力:

[EL Info]: 2017-11-29 14:56:23.809--ServerSession(1905114489)--EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd 
 
[EL Info]: connection: 2017-11-29 14:56:24.091--ServerSession(1905114489)--file:////COMPHOME/homedir$/X00136103/Documents/CA2BANKACCOUNT/build/classes/_CA2BANKACCOUNTPU login successful 
 
[EL Warning]: 2017-11-29 14:56:24.356--UnitOfWork(48522228)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
 
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: "PHONE": invalid identifier 
 

 
Error Code: 904 
 
Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
 
Call: SELECT CID, address, age, email, firstname, lastname, phone FROM Client 
 
Query: ReadAllQuery(referenceClass=Client sql="SELECT CID, address, age, email, firstname, lastname, phone FROM Client") 
 
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: "PHONE": invalid identifier 
 

 
Error Code: 904 
 
Call: SELECT CID, address, age, email, firstname, lastname, phone FROM Client 
 
Query: ReadAllQuery(referenceClass=Client sql="SELECT CID, address, age, email, firstname, lastname, phone FROM Client") 
 
\t at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:378) 
 
\t at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:260) 
 
\t at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:469) 
 
\t at model.dbOperations.viewClients(dbOperations.java:21) 
 
\t at test.Test.main(Test.java:18) 
 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
 
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: "PHONE": invalid identifier 
 

 
Error Code: 904 
 
Call: SELECT CID, address, age, email, firstname, lastname, phone FROM Client 
 
Query: ReadAllQuery(referenceClass=Client sql="SELECT CID, address, age, email, firstname, lastname, phone FROM Client") 
 
\t at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340) 
 
\t at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:682) 
 
\t at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558) 
 
\t at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2002) 
 
\t at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570) 
 
\t at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242) 
 
\t at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) 
 
\t at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299) 
 
\t at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694) 
 
\t at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2738) 
 
\t at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2691) 
 
\t at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:495) 
 
\t at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1168) 
 
\t at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) 
 
\t at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127) 
 
\t at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403) 
 
\t at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215) 
 
\t at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) 
 
\t at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804) 
 
\t at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1786) 
 
\t at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1751) 
 
\t at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) 
 
\t ... 3 more 
 
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "PHONE": invalid identifier 
 

 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
 
\t at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017) 
 
\t at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655) 
 
\t at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249) 
 
\t at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:776) 
 
\t at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897) 
 
\t at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867) 
 
\t at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502) 
 
\t at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1007) 
 
\t at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:642) 
 
\t ... 23 more

どんなに私が実行しようとするもの、それは表のように思えるん 'を見つけることができません電話'。それは絶えず無効であり、私はなぜそれがわからない。

+0

ORA-00904は、エラーを投げるデータベースであり、EclipseLinkではないことを示します。そのエラーはいくつかの他の時間について以前に尋ねられています。素早くGoogleが原因を説明します。あなたが提供したSQLを作成する際に致命的なタイプミスがあるとすれば、それは実行されたSQLではないと仮定します。 – Gimby

+0

表の記述を行い、 'PHONE'列が存在し、正しく入力されていることを確認しますか? –

+0

@ジンビーええ、私は貼っていたときに何とか括弧を取り除いた。今編集されました。私はすべてのSQLをテストし、提供されたSQLからすべてのテーブルを作成したので、EclipseLinkがエラーを出していることを約100%確信しています。それらはすべて正常に動作しますが、TypedQueryオブジェクトを使用して同じテーブルをクエリしようとすると、エラーがスローされます。 – Grizzly

答えて

0

あなたは書きました:

私はここで作成コードを持っている、と何も場違いようです。

しかし、私はあなたの作成スクリプト比較する場合:

create table Client (
    cid NUMBER PRIMARY KEY, 
    fname VARCHAR2(255) NOT NULL, 
    lname VARCHAR2(255) NOT NULL, 
    email VARCHAR2(255), 
    phone VARCHAR2(255), 
    address VARCHAR(255) NOT NULL, 
    age number NOT NULL 
); 

とスタックトレースからSELECT声明:

Error Code: 904 
Call: SELECT CID, address, age, email, firstname, lastname, phone FROM Client 

を、彼らは同じではありません。 stacktraceでは、これがEclipseLinkが生成しているものです。firstnamelastnameの列があります。これらの列の名前は、CREATE TABLEステートメントにありません。エンティティを編集したりDDLを修正しなければならないと思います。

更新:

それはあなたのために働いていない理由を私は知りません。私はOracleの11とEclipseLinkの上、以下を行っている、とすべてが作品です:

  • エンティティ:から

    CREATE TABLE CLIENT (
        CID NUMBER(10) NOT NULL, 
        address VARCHAR2(255) NOT NULL, 
        AGE NUMBER(10) NULL, 
        EMAIL VARCHAR2(255) NULL, 
        firstname VARCHAR2(255) NOT NULL, 
        lastname VARCHAR2(255) NOT NULL, 
        PHONE VARCHAR2(255) NULL, PRIMARY KEY (CID)) 
    
  • スクリーンショット:

    @Entity 
    public class Client { 
    
        @Id 
        @GeneratedValue 
        private int cid; 
    
        @Column(name = "firstname", nullable = false) 
        private String fname; 
    
        @Column(name = "lastname", nullable = false) 
        private String lname; 
    
        private String email; 
        private String phone; 
    
        @Column(name = "address", nullable = false) 
        private String address; 
        int age; 
    
        public int getCid() { 
         return cid; 
        } 
    
        public void setCid(int cid) { 
         this.cid = cid; 
        } 
    
        // rest of getters/setters 
    } 
    
  • のEclipseLinkは、SQLを生成し

    DB enter image description here

+0

私はこれをしばらく使ってきました。select文は、すべてのクライアント変数に対して定義した列名から変数を受け取るだけです。これは、より良いhttps://i.imgur.com/YhUYTTV.pngを記述するかもしれません。私は、このような列の名前を付けずに、データベース内の対応するフィールドと同じ名前を付けずに、クエリを実行しようとしました。それは何も変わらないようです。別の方法として、「電話」を完全に削除して、「lname」列が無効であると言いました。無効な識別子以外の何かが間違っているようです。 – Grizzly

+0

更新された回答を見てください。あなたが間違っている場所を見つけるのに役立つかもしれません。 – ujulu

+0

プロジェクトの作成プロセス全体を遡ってすべてを再設定してコードを使用した後、私は突然何が間違っているのかを認識しました。パーシスタンスユニットが間違った方法で構成され、別のデータベーススキーマにクエリを実行していて、他のスキーマにクライアントテーブルが含まれていました。問題は今解決され、クエリは完全に動作しているようです。 – Grizzly