web-dev-qa-db-fra.com

Comment appeler la requête nommée

J'ai écrit une requête nommée dans la classe d'entité Voter

NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password),

Je souhaite appeler cette requête nommée et je dois également définir un ID d'électeur et un mot de passe.

Pouvez-vous m'aider. Je vous remercie

20
sandeep

Je suppose que vous avez manqué le symbole @ sur votre annotation NamedQuery?

Dans le code, vous l'appeleriez comme ceci:

List results = em.createNamedQuery("Voter.findvoter")
    .setParameter("voterID", "blah")
    .setParameter("password","blahblahblah")
    .getResultList();
38
Dick Chesterwood

Votre requête nommée pose deux problèmes évidents:

  • C'est une annotation donc ce devrait être @NamedQuery et pas seulement NamedQuery
  • Votre requête est actuellement: 

query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password.

Le problème est que vous terminez votre chaîne après :voterID, au lieu d’après :password et que vous avez "où" deux fois et que vous avez un espace entre ":" et "mot de passe". Votre requête devrait ressembler à ceci:

query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID and v.password= :password"

(Je viens de déplacer le "à la fin et a supprimé le deuxième" où "et l'espace après le": ")

4
brent777

Les étapes communes sont (requête nommée ou autre)

  1. Créer une requête - em a cinq méthodes de création.
  2. Définissez la requête avec des paramètres si nécessaire - l'interface de requête utilise ces méthodes.
  3. Exécuter la requête - l'interface de requête a 3 méthodes liées à l'exécution.

avec les trois étapes ci-dessus, vous pouvez exécuter n'importe quelle requête JPA.

2
OpenSource

En fait, le brent a raison, votre NameQuery devrait ressembler à ceci,

@NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID AND where v.password = :password")
@Entity
public class Voter implements Serializable{ ... }

et ailleurs vous devriez essayer celui-ci (ce que Dick a déjà dit)

public class VoterFasade{
    public List<Voter> findVoter(long id,String password){
        List<Voter> results = em.createNamedQuery("Voter.findvoter")
            .setParameter("voterID", id)
            .setParameter("password",password)
            .getResultList();
        return result;
    }
}

alors vous pourriez l'utiliser comme

@Inject
VoterFasade voterFasade;

///
long id=12;
voterFasade.findVoter(id);

devrait réellement fonctionner (c'est un code non compilé).

vous pouvez également le faire avec Repository, consultez le lien ci-dessous, partie Repository Listing23.Example repository entrez la description du lien ici

1
Reza Payambari