2011-02-13 2 views
7

netbeansウィザードでエンティティBeanを作成し、データベースからデータを取得しようとしています。どんなSQLクエリを使用しても、動作しません。私は、ウィザードによって作成された名前付きクエリを使用してみました:JPAで簡単なクエリを構文解析するときのエラー

@NamedQuery(name = "Usr.findAll", query = "SELECT u FROM Usr u") 

それが返されます。

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [Usr.findAll], line 1, column 0: unexpected token [Usr]. 

私がしようとすると、

SELECT uid FROM usr; 

私が手:

Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [SELECT uid FROM usr;], line 0, column -1: unexpected end of query. 
Internal Exception: MismatchedTokenException(-1!=78) 

と私がしようとした場合でも:

SELECT * FROM usr 

私が手:データを取得するための

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [SELECT * FROM usr], line 1, column 7: unexpected token [*]. 

私の行は次のとおりです。

@PersistenceContext 
EntityManager em; 
.... 

em=Persistence.createEntityManagerFactory("SchoolPU").createEntityManager(); 
List users = em.createQuery("SELECT * FROM usr").getResultList(); 

この些細な問題で私を助けることができますか?

Usrのエンティティクラス:私は、エンティティを使用

import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Lob; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 

/** 
* 
* @author danizmax 
*/ 
@Entity 
@Table(name = "USR") 
@NamedQueries({ 
    @NamedQuery(name = "Usr.findAll", query = "SELECT u FROM Usr u"), 
    @NamedQuery(name = "Usr.findByUid", query = "SELECT u FROM Usr u WHERE u.uid = :uid"), 
    @NamedQuery(name = "Usr.findByPassword", query = "SELECT u FROM Usr u WHERE u.password = :password"), 
    @NamedQuery(name = "Usr.findByFistname", query = "SELECT u FROM Usr u WHERE u.fistname = :fistname"), 
    @NamedQuery(name = "Usr.findByLastname", query = "SELECT u FROM Usr u WHERE u.lastname = :lastname"), 
    @NamedQuery(name = "Usr.findByAddress1", query = "SELECT u FROM Usr u WHERE u.address1 = :address1"), 
    @NamedQuery(name = "Usr.findByAddress2", query = "SELECT u FROM Usr u WHERE u.address2 = :address2"), 
    @NamedQuery(name = "Usr.findByPostcode", query = "SELECT u FROM Usr u WHERE u.postcode = :postcode"), 
    @NamedQuery(name = "Usr.findByEmail", query = "SELECT u FROM Usr u WHERE u.email = :email"), 
    @NamedQuery(name = "Usr.findByPhone", query = "SELECT u FROM Usr u WHERE u.phone = :phone")}) 
public class Usr implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "UID", nullable = false, length = 8) 
    private String uid; 
    @Basic(optional = false) 
    @Column(name = "PASSWORD", nullable = false, length = 20) 
    private String password; 
    @Basic(optional = false) 
    @Column(name = "FISTNAME", nullable = false, length = 30) 
    private String fistname; 
    @Basic(optional = false) 
    @Column(name = "LASTNAME", nullable = false, length = 60) 
    private String lastname; 
    @Basic(optional = false) 
    @Column(name = "ADDRESS1", nullable = false, length = 100) 
    private String address1; 
    @Column(name = "ADDRESS2", length = 100) 
    private String address2; 
    @Basic(optional = false) 
    @Lob 
    @Column(name = "CITY", nullable = false) 
    private byte[] city; 
    @Basic(optional = false) 
    @Column(name = "POSTCODE", nullable = false, length = 10) 
    private String postcode; 
    @Column(name = "EMAIL", length = 50) 
    private String email; 
    @Column(name = "PHONE") 
    private Integer phone; 

    public Usr() { 
    } 

    public Usr(String uid) { 
     this.uid = uid; 
    } 

    public Usr(String uid, String password, String fistname, String lastname, String address1, byte[] city, String postcode) { 
     this.uid = uid; 
     this.password = password; 
     this.fistname = fistname; 
     this.lastname = lastname; 
     this.address1 = address1; 
     this.city = city; 
     this.postcode = postcode; 
    } 

    public String getUid() { 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getFistname() { 
     return fistname; 
    } 

    public void setFistname(String fistname) { 
     this.fistname = fistname; 
    } 

    public String getLastname() { 
     return lastname; 
    } 

    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 

    public String getAddress1() { 
     return address1; 
    } 

    public void setAddress1(String address1) { 
     this.address1 = address1; 
    } 

    public String getAddress2() { 
     return address2; 
    } 

    public void setAddress2(String address2) { 
     this.address2 = address2; 
    } 

    public byte[] getCity() { 
     return city; 
    } 

    public void setCity(byte[] city) { 
     this.city = city; 
    } 

    public String getPostcode() { 
     return postcode; 
    } 

    public void setPostcode(String postcode) { 
     this.postcode = postcode; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public Integer getPhone() { 
     return phone; 
    } 

    public void setPhone(Integer phone) { 
     this.phone = phone; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (uid != null ? uid.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Usr)) { 
      return false; 
     } 
     Usr other = (Usr) object; 
     if ((this.uid == null && other.uid != null) || (this.uid != null && !this.uid.equals(other.uid))) { 
      return false; 
     } 
     return true; 
    } 



    @Override 
    public String toString() { 
     return "org.danizmax.Usr[uid=" + uid + "]"; 
    } 

} 

persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SchoolPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/school</jta-data-source> 
    <properties> 
    </properties> 
    </persistence-unit> 
</persistence> 

クラス:

import java.util.Iterator; 
import java.util.List; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 
import javax.persistence.PersistenceContext; 

/** 
* 
* @author danizmax 
*/ 
@Stateless 
public class ValidatorBean { 

    @PersistenceContext 
    EntityManager em; 

    public ValidatorBean() { 


    } 

    public boolean validate(String user, String pass) { 

     List users = em.createQuery("SELECT * FROM usr").getResultList(); 

     Iterator it = users.iterator(); 

     //ignore the stupid validation it's only to try out JPA 
     while(it.hasNext()){ 
      Usr u = (Usr) it.next(); 

      if(u.getUid().equals(user) && u.getPassword().equals(pass)){ 
       return true; 
      } 
     } 


     return false; 
    } 
} 

UPDATE:あなたに公平を期すために、あなたの努力に答えて報われた人たち。 echnologyとそれを現実の世界で使用するために、私は自分の長年前に見つけた最も可能性の高い解決策である最良の答えを与えてこの答えを閉じることに決めました。

+0

私は解決策を見つけましたが、まさにそれが何であったかを覚えておらず、コードでのキャストとは何かがあったということだけを覚えています。私がそれが何であるかを正確に把握すれば、私はそれを答えとして掲示するでしょう。 – danizmax

答えて

4

、他の人はJPQLないので、エラーが発生する必要があります。 SQLには@NamedNativeQueryを使用します。最初のクエリのために

、これは例外説明

、あなたが本当にエラーを取得するために使用しているものではありません:構文エラーがクエリを解析し、[Usr.findAll]、行1、列0予期しないトークン[Usr]。

メモ「列0」は「Usr」と表示されていますが、名前の代わりに名前をクエリに入れたようです。私の推測はあなたがやっているのですか?

em.createQuery( "Usr.findAll")。getResultList();

しかし、やるべきこと、

em.createNamedQuery( "Usr.findAll")getResultList();

あるいは、

em.createQuery( "UsrのUからUの選択")getResultList();

を参照してください、 http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL

+0

答えはおめでとう! – danizmax

2

フェッチしようとしているエンティティのクラス名は何ですか? (たぶん@NamedQueryを配置したクラスを表示する必要があります)。

これは実際にUsrですか、それともUserですか?最後の場合は、Select u from User uは間違いなく動作するはずです。

さらに、@PersistenceContextem=Persistence.createEntityManagerFactory(...)の両方を必要としません。いずれかを使用してください。管理対象環境にいる場合は、インジェクションバリアントを使用してください。エンティティマネージャを自分で作成すると、いわゆるapplication managed entity managerとなります。そのためには、コードをもっとうまく管理して、正しく処理する必要があります。

+0

エンティティUsrはnetbeansウィザードを使用して既存のderbyテーブルから作成されたので、私のコードはhello worldであり、エンティティクラスからのデータベース内のテーブルの自動生成さえも機能していないため、それはすべきです。私は管理された環境にいるかどうかをどのように知るのですか? – danizmax

+0

Glassfishにデプロイする場合、@PersistenceContextが表示されるコードがServlet、ServletFilter、JSFマネージドBean、CDI Bean、またはEJB Beanである場合、管理対象環境になります。基本的には、new演算子でこれらのオブジェクトをインスタンス化しないで、persistence.xmlファイルを使用して永続性ユニットを宣言するだけです。 –

+0

クラスを追加しました。これはUSRテーブルからウィザードで生成されたクラスであることに注意してください。それは、テーブルに動作するデータをコミット動作する必要があります、SQL文は認識されません。私はpersistence.xmlも追加します。何が間違っているのかをあなたに知らせるかもしれません。私は接続のためにEclipseLink 2.0を使用しています。 – danizmax

0

EclipseLinkは、比較的単純な構成上の問題で、かなり一般的なまたは謎めいたエラーメッセージを出す傾向があります。

Usrクラスへの参照がありません。persistence.xmlです。クラスを追加するか、永続性を処理するクラスをEclipseLinkに知らせるパス参照を追加する必要があります。ここでは、直接クラス参照して例を示します

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SchoolPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/school</jta-data-source> 
    <class>my.package.Usr</class> 
    </persistence-unit> 
</persistence> 

クラスの参照は、最も簡単な方法ですが、あなたは多くのクラスを持っている場合、管理が面倒になることができます。

+0

すでに試してみました。結果は同じです。名前付きクエリ "Usr.findAll"は、[Usr.findAll]、行1、列0:予期しないトークン[Usr]の構文解析エラーを返します。私はnetbeansの私のインストールに何かが間違っていると思います。 – danizmax

0

私は同じ問題を抱えていました。 Strangsソリューション - 私にとって - でした:Toplinkは、persistence.xmlと比較するときに、 "Tablename"の大文字小文字を区別して扱います。したがって、標準のラクダのケース名をJavaクラスに使用する場合は、クエリで同じラクダのケース名を使用する必要があります。私はまったく誤解を招くエラーメッセージが非常に好きです。

+0

私は全てを大文字に変換しました、bean、エンティティ、persistance.xml、データベースでさえ同じものを表示していますが、私はまだ取得しています例外:構文解析エラー[USR.findAll]、行1、カラム0トークン[USR]。シンプルなJPAのために....... – danizmax

5

私は同じ問題を抱えていました。私の場合は、このメソッドを使用しました。
em.createQuery( "Usr.findAll");
の代わりに
em.createNamedQuery( "Usr.findAll");

+0

私は同じことで2時間を無駄にしました...私はエラーが私のせいだったと受け入れていますが、私はあまりにもエラーメッセージがいかに非記述的であるかに満足していません... – jahroy

1

この質問は少し古いようですので、これが役立つかどうかはわかりません。しかし、あなたが.createNativeQuery(...)代わりの.createQuery(...)を使用する場合がありますのように:あなただけの最初のクエリが正しい

List users = em.createNativeQuery("SELECT * FROM usr").getResultList();
0

私は私の@NamedQueryと、このような問題を抱えていました。それは全く機能しませんでした。 em.createQuery("anything.anotherthing")em.createNamedQuery("anything.anotherthing")で変更して問題を解決しましたが、うまくいきました。

関連する問題