Requete Jpql Select * From... [Résolu]

-
Bonjour,
je suis entrain de développer une application en J2ee on utilisant Jdeveloper
lors de l'exécution de la requête suivante
    public User authentification(String login, String pwd) {
        
        try{
                return (User) em.createQuery("select o from User o where o.loginUser = '" +  login+ "' AND o.pwdUser = '" + pwd + "'",User.class).getSingleResult();
            
               
        }catch(Exception e){
                e.printStackTrace();
                return null;
        }
        
    }


il m'affiche l'erreur suivante :
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00903: nom de table non valide

Error Code: 903
Call: SELECT ID, LOGIN_USER, NOM_USER, PRENOM_USER, PWD_USER, ROLE_USER, VERSION, "ID-USER" FROM USER WHERE ((LOGIN_USER = ?) AND (PWD_USER = ?))
bind => [2 parameters bound]
Query: ReadAllQuery(referenceClass=User sql="SELECT ID, LOGIN_USER, NOM_USER, PRENOM_USER, PWD_USER, ROLE_USER, VERSION, "ID-USER" FROM USER WHERE ((LOGIN_USER = ?) AND (PWD_USER = ?))")
j'ai déja ajouter le nom de la classe User dans le fichier persistence.xml et j'ai ajouter l'annotation @table et @Entity dans la classe User...
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
15854
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
7 décembre 2018
1
Merci
Il ne faut JAMAIS construire une requête en concaténant des variables dynamiques qui peuvent potentiellement prendre n'importe quelle valeur.

Avec ta requête :

"select o from User o where o.loginUser = '" + login
+ "' and o.pwdUser = '" + pwd + "'"

Je prends
login="toto' or (o.loginUser = 'toto"

et
pwd="plop') or o.loginUser = 'toto"
ce qui me donne :

select o from User o where o.loginUser = 'toto' 
or (o.loginUser = 'toto' and o.pwdUser = 'plop') or o.loginUser = 'toto'

Ce qui se simplifie en
select o from User o where o.loginUser = 'toto'


En gros, j'ai réussi à supprimer la vérification du mot de passe.
Je peux donc me connecter avec n'importe quel login sans problème !

Pour régler ce problème il faut faire comme ceci :

Query query = em.createQuery("select o from User o where "
+" o.loginUser = :LOGIN AND o.pwdUser = :PWD");
query.setParameter("LOGIN",login);
query.setParameter("PWD",pwd);
return query.getSingleResult();

La méthode setParameter garantie que les String ne seront pas simplement concaténées, mais que quelque soit la valeur, la requête sera bien celle attendue.

Merci KX 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Merci pour votre aide mais lorsque exécute la requête il m'affiche l'erreur suivante:
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [select o from User o where o.loginUser = :USER_LOGIN AND o.pwdUser = :USER_PWD].
[14, 18] The abstract schema type 'User' is unknown.
[27, 38] The state field path 'o.loginUser' cannot be resolved to a valid type.
[57, 66] The state field path 'o.pwdUser' cannot be resolved to a valid type.
KX
Messages postés
15854
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
7 décembre 2018
-
Comment est ce que tu as fait ta classe user ?
Est ce que tu as bien des champs pwdUser, loginUser, et des getters public pour chacun des deux ?
oui bien sur voici la classe User


package model;

import java.io.Serializable;

import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table(name="USER")
@NamedQueries({ @NamedQuery(name = "User.findAll", query = "select o from User o") })
public class User implements Serializable {
private static final long serialVersionUID = 2826347543310963633L;
@Id
@Column(nullable = false, length = 20)
private String id;
@Column(name = "LOGIN_USER", length = 20)
private String loginUser;
@Column(name = "NOM_USER", length = 20)
private String nomUser;
@Column(name = "PRENOM_USER", length = 20)
private String prenomUser;
@Column(name = "PWD_USER", length = 20)
private String pwdUser;
@Column(name = "ROLE_USER", length = 20)
private String roleUser;
@Column(nullable = false, length = 20)
private String version;
@Column(name = "\"ID-USER\"")
private BigDecimal xId_user_;

public User() {
}

public User(String id, String loginUser, String nomUser, String prenomUser, String pwdUser, String roleUser,
String version, BigDecimal xId_user_) {
this.id = id;
this.loginUser = loginUser;
this.nomUser = nomUser;
this.prenomUser = prenomUser;
this.pwdUser = pwdUser;
this.roleUser = roleUser;
this.version = version;
this.xId_user_ = xId_user_;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getLoginUser() {
return loginUser;
}

public void setLoginUser(String loginUser) {
this.loginUser = loginUser;
}

public String getNomUser() {
return nomUser;
}

public void setNomUser(String nomUser) {
this.nomUser = nomUser;
}

public String getPrenomUser() {
return prenomUser;
}

public void setPrenomUser(String prenomUser) {
this.prenomUser = prenomUser;
}

public String getPwdUser() {
return pwdUser;
}

public void setPwdUser(String pwdUser) {
this.pwdUser = pwdUser;
}

public String getRoleUser() {
return roleUser;
}

public void setRoleUser(String roleUser) {
this.roleUser = roleUser;
}

public String getVersion() {
return version;
}

public void setVersion(String version) {
this.version = version;
}

public BigDecimal getXId_user_() {
return xId_user_;
}

public void setXId_user_(BigDecimal xId_user_) {
this.xId_user_ = xId_user_;
}
}
KX
Messages postés
15854
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
7 décembre 2018
-
Est-ce que c'est la première fois que tu testes ton code, ou est-ce que tu as certaines requêtes qui fonctionnent ?

Essayes de renommer ta classe de manière à ce qu'elle ne porte pas le même nom que ta table en base de donnée. Ici tu as User pour les deux (à la casse près) et il est possible qu'il se mélange les pinceaux et pense que tu utilises la table User alors qu'il attends la classe User...

Au passage, tu peux renommer tes attributs pour qu'ils ressemblent plus à des objets Java qu'à une colonne de base de données. Inutile par exemple de rappeler "User" à chaque attribut, on le sait vu que c'est la classe User (ou UserEntity dans mon exemple).

@Entity 
@Table(name="USER")
public class UserEntity
{
    @Column(name="LOGIN_USER", length = 20) 
    private String login;
    
    @Column(name="PWD_USER", length = 20) 
    private String password;

Query query = em.createQuery("select u from UserEntity u where "
+" u.login = :LOGIN AND u.password = :PWD");
Commenter la réponse de KX
0
Merci
Bonjour
Oui t'as raison il y'a un conflit entre le nom de la classe et le nom de la table au niveau de BD... Le Probleme maintenant que
query.getSingleResult s'exécute si seulement si la table contient une seule ligne... Donc il m'affiche une exeption 'More than one result was returned from Query.getSingleResult()' lorsque ma table contient plusieurs ligne....
Pouvez-vous m'aider??
Merci
KX
Messages postés
15854
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
7 décembre 2018
-
N'utilise query.getSingleResult() que si tu as toujours un seul résultat (éventuellement aucun en gérant les exceptions). Si tu attends plusieurs résultats utilise query.getResultList().
Problème résolue
1000 Merci
Commenter la réponse de omarkalkaf

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.