Requete Jpql Select * From...

Résolu
omarkalkaf - Modifié par cs_Julien39 le 10/03/2014 à 14:19
 omarkalkaf - 10 mars 2014 à 14:34
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...

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
26 févr. 2014 à 23:32
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.
1
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
27 févr. 2014 à 12:13
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 ?
0
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_;
}
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
27 févr. 2014 à 19:19
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");
0
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
10 mars 2014 à 13:17
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().
0
Problème résolue
1000 Merci
0
Rejoignez-nous