Erreur de syntaxe de l'analyse d'un trivial requête avec JPA
J'ai créé l'entité bean avec netbeans assistant et essaie d'obtenir des données à partir de la base de données. N'importe quelle requête SQL puis-je l'utiliser,il ne fonctionne pas. J'ai essayé d'utiliser une requête nommée qui a été créé par l'assistant:
@NamedQuery(name = "Usr.findAll", query = "SELECT u FROM Usr u")
Il retourne:
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].
Si j'essaie;
SELECT uid FROM usr;
J'obtiens:
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)
et même si j'essaie :
SELECT * FROM usr
J'obtiens:
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 [*].
Ma ligne pour l'obtention des données est:
@PersistenceContext
EntityManager em;
....
em=Persistence.createEntityManagerFactory("SchoolPU").createEntityManager();
List users = em.createQuery("SELECT * FROM usr").getResultList();
Un peut m'aider avec ce problème trivial?
L'Usr classe d'entité:
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>
La classe où j'utilise l'entité:
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;
}
}
Mise à JOUR: être juste pour vous les gars qui ont répondu et la récompense de vos efforts, maintenant que j'ai réellement appris la technologie et de l'utiliser dans le monde réel, j'ai décidé de fermer cette réponse avec l'attribution de la meilleure réponse qui a été mon plus probable solution que j'ai trouvé mon auto il y a longtemps.
OriginalL'auteur danizmax | 2011-02-13
Vous devez vous connecter pour publier un commentaire.
Seulement votre première requête est correcte, les autres ne sont pas JPQL, ce qui devrait provoquer des erreurs. Utiliser un @NamedNativeQuery pour SQL.
Pour la première requête, cela ne semble pas être ce que vous êtes vraiment à l'aide de l'erreur,
Note le message d'erreur indique que la colonne "0" est "Usr", ce qui semble que vous mettez le nom de la requête à la place du nom. Ma conjecture est que vous faites,
Mais devrait être en train de faire,
Ou,
Voir,
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL
OriginalL'auteur James
J'ai eu le même problème. Dans mon cas, j'ai utilisé la méthode
em.createQuery("Usr.findAll");
au lieu de
em.createNamedQuery("Usr.findAll");
OriginalL'auteur stew
Quel est le nom de la classe de l'entité, vous êtes en train de chercher? (vous devrez peut-être pour montrer à la classe où vous avez placé le @NamedQuery).
Est-ce vraiment
Usr
ou peut-être lesUser
? Si le dernier est vrai,Select u from User u
devrait certainement travailler.En outre, vous n'avez pas besoin de deux
@PersistenceContext
etem=Persistence.createEntityManagerFactory(...)
. Utiliser soit l'un de ceux-ci. Si vous êtes dans un environnement géré, l'utilisation de l'injection de la variante. La création d'un gestionnaire d'entité vous-même vous donne un soi-disantapplication managed entity manager
pour lequel le code doit faire beaucoup plus d'administration pour garder les choses en allant vers la droite.Si vous déployez pour Glassfish et le code de @PersistenceContext apparaît est une Servlet, ServletFilter, JSF managed bean, bean CDI, ou EJB bean, alors vous êtes dans un environnement géré. Cela signifie essentiellement que vous n'avez pas instancier ces objets avec l'opérateur new et vous ne déclarez que vous l'unité de persistance à l'aide d'un persistence.xml fichier.
J'ai ajouté à la classe, à noter que c'est l'assistant de classe générée à partir de l'USR table. Il doit travailler, de commettre des données à la table de travaux, les instructions SQL sont tout simplement pas reconnu. Je vais aussi ajouter persistence.xml il peut vous donner l'idée de ce qui est mal. Je suis à l'aide de EclipseLink 2.0 pour la connexion.
Je suis un peu perplexe pour le moment. Les requêtes que vous avez créé pour l'em.createQuery() qui sont vraiment mauvais, de sorte que ces exceptions sont attendus. Mais la requête nommée semble ok pour moi. Quand exactement avez-vous obtenu cette exception? Lorsque Glassfish démarre ou lorsque vous exécutez un entityManager.createNamedQuery()?
Même ici... j'ai essayé quelques instructions SQL de mon propre pour tester le problème. Je n'ai pas de ligne de l'entityManager.createNamedQuery() dans mon code. Je vais poster mon haricot où suis-je la tentative d'utilisation de l'entité, peut-être que le problème est tellement évident que je ne peux pas le voir,
OriginalL'auteur Arjan Tijms
Ne sais pas si cela va vous aider ou pas, cette question semble un peu vieux. Cependant, vous pourriez vouloir utiliser
.createNativeQuery(...)
au lieu de.createQuery(...)
comme dans:OriginalL'auteur andand
EclipseLink a tendance à donner assez générique ou cryptique des messages d'erreur sur relativement simples problèmes de configuration.
Je devine que vous êtes en manque une référence à la
Usr
classe danspersistence.xml
. Vous devez ajouter la classe, ou d'ajouter un chemin d'accès de référence qui indique EclipseLink quelles classes de processus pour la persistance. Voici un exemple avec un direct de la classe de référence:Une classe de référence est la plus simple, mais peut devenir fastidieux à gérer si vous avez plusieurs classes.
OriginalL'auteur Kim Burgaard
J'ai eu le même problème. Strangs solution -pour moi - est: Toplink traite de la "Tablename" sensible à la casse lors de la comparaison avec persistence.xml. Donc, si vous utilisez la norme chameau cas des noms de classes java, vous devez utiliser le même chameau cas des noms dans votre requête. J'aime beaucoup le totalement trompeuse message d'erreur.
OriginalL'auteur jörg
J'ai eu un problème comme ça avec mon @NamedQuery. Il ne fonctionne pas du tout. J'ai résolu le problème en changeant
em.createQuery("anything.anotherthing")
parem.createNamedQuery("anything.anotherthing")
et maintenant ça fonctionne.OriginalL'auteur musef