2011-02-13 41 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:为了公平对待你那些回答并奖励你的努力的人,现在我已经学会了技术,并在现实世界中使用它,我决定关闭这个答案,并颁发最好的答案,这是我很久以前发现自己最可能的解决方案。

+0

我确实找到了解决方案,但不记得究竟是什么,只是它与代码中的投射有关。如果我弄清楚它到底是什么,我会把它作为答案发布。 – danizmax 2012-02-03 07:18:57

回答

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

2

你试图获取的实体的类名是什么? (也许你需要显示放置@NamedQuery的类)。

难道这真的是Usr还是User?如果最后是真的,Select u from User u应该肯定能工作。

此外,你不需要两个@PersistenceContextem=Persistence.createEntityManagerFactory(...)。使用其中任何一个。如果您处于托管环境中,请使用注入变体。自己创建一个实体管理器会给你一个所谓的application managed entity manager,为此你的代码必须做更多的管理来保持事情正确。

+0

实体Usr是使用netbeans向导从现有的derby表创建的,所以我猜测还有其他错误,因为我的代码是hello world琐碎的,甚至在实体类中自动生成数据库中的表也不工作它应该。我如何知道我是否处于托管环境? – danizmax 2011-02-13 13:29:28

+0

如果您正在部署到Glassfish,并且@PersistenceContext出现的代码是Servlet,ServletFilter,JSF托管bean,CDI bean或EJB bean,那么您处于托管环境中。它基本上意味着你不用new操作符实例化那些对象,而只使用persistence.xml文件声明你的持久化单元。 – 2011-02-13 13:33:05

+0

我添加了这个类,注意这是从USR表中向导生成的类。它应该工作,将数据提交给表的工作,SQL语句只是无法识别。我也将添加persistence.xml,它可能会让你知道什么是错的。我正在使用EclipseLink 2.0进行连接。 – danizmax 2011-02-14 16:02:59

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

我有同样的问题。 Strangs解决方案 - 对我来说 - 是:Toplink在与persistence.xml进行比较时将“Tablename”区分大小写。因此,如果您为java类使用标准驼峰大小写名称,则必须在查询中使用相同的骆驼大小写名称。我非常喜欢这个完全误导性的错误信息。

5

我有同样的问题。在我的情况下,我使用的方法
em.createQuery(“Usr.findAll”);
而不是
em.createNamedQuery(“Usr.findAll”);

1

不知道这是否会帮助你,因为这个问题似乎有点老。然而,你可能想使用.createNativeQuery(...),而不是.createQuery(...)为:

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

我有这样一个问题,我的@NamedQuery。它根本没有工作。我解决了em.createQuery("anything.anotherthing")em.createNamedQuery("anything.anotherthing")改变的问题,现在它工作正常。