Синтаксическая ошибка при разборе тривиального запроса с помощью JPA - PullRequest
7 голосов
/ 13 февраля 2011

Я создал компонент управления данными с помощью мастера NetBeans и пытаюсь получить данные из базы данных.Независимо от того, какой SQL-запрос я использую, он не работает.Я попытался использовать именованный запрос, который был создан мастером:

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

ОБНОВЛЕНИЕ: Если быть честным, ребята, которые ответили и вознаградили вас за усилия, теперь, когда я действительно научилсятехнологии и использовать ее в реальном мире, я решил завершить этот ответ наградой лучшего ответа, который был моим наиболее вероятным решением, которое я нашел сам давно.

Ответы [ 7 ]

5 голосов
/ 21 марта 2011

У меня была такая же проблема. В моем случае я использовал метод
em.createQuery ( "Usr.findAll");
вместо
em.createNamedQuery ( "Usr.findAll");

4 голосов
/ 17 октября 2012

Только ваш первый запрос правильный, остальные не JPQL, поэтому должны вызывать ошибки. Используйте @NamedNativeQuery для SQL.

Для первого запроса это не то, что вы действительно используете, чтобы получить ошибку,

Описание исключения: синтаксическая ошибка при синтаксическом анализе запроса [Usr.findAll], строка 1, столбец 0: неожиданный токен [Usr].

Обратите внимание, что ошибка говорит о том, что «столбец 0» - это «Usr», что означает, что вы вводите имя в запросе вместо имени. Я думаю, вы делаете,

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

Но должно быть,

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

Или,

em.createQuery («Выберите вас из США»). GetResultList ();

См http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL

2 голосов
/ 13 февраля 2011

Какое имя класса сущности, которую вы пытаетесь получить?(возможно, вам нужно показать класс, в который вы поместили @NamedQuery).

Это действительно Usr или User?Если последнее верно, Select u from User u определенно должно работать.

Кроме того, вам не нужны и @PersistenceContext, и em=Persistence.createEntityManagerFactory(...).Используйте любой из них.Если вы находитесь в управляемой среде, используйте вариант внедрения.Самостоятельное создание менеджера сущностей дает вам так называемый application managed entity manager, для которого ваш код должен выполнять гораздо больше администрирования, чтобы все шло нормально.

1 голос
/ 16 октября 2012

Не уверен, поможет ли это вам или нет, так как этот вопрос кажется немного старым.Однако вы можете использовать .createNativeQuery(...) вместо .createQuery(...), например:

List users = em.create<b>Native</b>Query("SELECT * FROM usr").getResultList(); 
0 голосов
/ 07 июня 2013

У меня была такая проблема с моим @NamedQuery.Это не сработало вообще.Я решил проблему, изменив em.createQuery("anything.anotherthing") на em.createNamedQuery("anything.anotherthing"), и теперь он работает нормально.

0 голосов
/ 16 февраля 2011

У меня была такая же проблема.Решение Strangs - для меня - было: Toplink обрабатывает регистр с учетом регистра при сравнении с persistence.xml.Поэтому, если вы используете стандартные имена падежа верблюда для своих классов Java, вы должны использовать те же имена падежа верблюда в своем запросе.Мне очень нравится вводящее в заблуждение сообщение об ошибке.

0 голосов
/ 16 февраля 2011

EclipseLink имеет тенденцию выдавать довольно общие или загадочные сообщения об ошибках при относительно простых проблемах конфигурации.

Я предполагаю, что в persistence.xml отсутствует ссылка на класс Usr.Вы должны либо добавить класс, либо добавить ссылку на путь, которая сообщает 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>

Ссылка на класс является наиболее прямым подходом, но управлять им может быть утомительно, если у вас много классов.

...