IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Personnalisation de requêtes


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 7
    Par défaut Personnalisation de requêtes
    Salut à tous,

    Je suis en train de refondre la partie orm d'une application avec JPA et je voulais savoir s'il étais possible de définir des requêtes natives avec @NamedNativeQuery qui pourraient être personnalisées (un peu de la même manière que pour les paramètres -> ?1 ou :param), concrètement je voudrait pouvoir ajouter une clause where (s'il le faut) à ma requête.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Quelque chose de ce style la ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Entity
    @SqlResultSetMapping(name = "implicit", entities = @EntityResult(entityClass = data.Employee.class))
    @NamedNativeQuery(name = "implicitSample", query = "select e.empno empNumber, e.ename empName, e.job empJob, e.sal empSalary, salg.grade empGrade from emp e, salgrade salg where e.sal between salg.losal and salg.HISAL", resultSetMapping = "implicit")
    //@SqlResultSetMapping(name = "explicit", entities = { @EntityResult(entityClass = data.Employee.class, fields = { 
    //    @FieldResult(name = "empNumber", column = "empno"), 
    //    @FieldResult(name = "empName", column = "ename"),
    //    @FieldResult(name = "empJob", column = "job"), 
    //    @FieldResult(name = "empSalary", column = "sal"), 
    //    @FieldResult(name = "empGrade", column = "grade") }) })
    //@NamedNativeQuery(name = "implicitSample", 
    //    query = "select e.empno empno, e.ename ename, e.job job, e.sal sal, salg.grade grade from emp e, salgrade salg where e.sal between salg.losal and salg.HISAL", resultSetMapping = "explicit")
    Sinon il est aussi possible de faire des requetes en JPQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT c FROM Customer c 	Returns all the customers
    SELECT c FROM Customer c WHERE c.firstname='John' 	Returns the customers which first name is 'John'
    SELECT c FROM Customer c ORDER BY c.lastname 	Returns all the customers ordered by last name
    SELECT c FROM Customer c WHERE c.homeAddress.country='US' 	Customers who live in the US
    Pour plus de détails... la doc Jpa

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut Utilisez le concept de JDBC 4.0 pour les NamedQueries
    J'ai eu aussi du mal avec les annotations (parametre nome ou pas, unicite du nom, ..) et j'ai finalement reussi a ecrire un Proxy dynamique pour executer les NamedQuery. Le code et la
    et le proxy dynamique a cette tete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            boolean isMultiResults = Collection.class.isAssignableFrom(method.getReturnType());
            String queryName;
            boolean useNames = useParamNames;
            JpaNamedQuery jpaNamedQuery = method.getAnnotation(JpaNamedQuery.class);
            if (method.isAnnotationPresent(JpaQueryUseParamNames.class)) {
                useNames = true;
            }
            if (jpaNamedQuery != null) {
                queryName = jpaNamedQuery.queryName();
            } else {
                queryName = prefix + method.getName();
            }
            Query namedQuery = em.createNamedQuery(queryName);
            // TODO: Manage Temporal params
            if (useNames) {
                if (args != null && args.length > 0) {
                    Annotation[][] parameterAnnotations = method.getParameterAnnotations();
                    for (int i = 0; i < args.length; i++) {
                        String paramName = null;
                        Annotation[] paramAnnos = parameterAnnotations[i];
                        for (int j = 0; j < paramAnnos.length; j++) {
                            Annotation paramAnno = paramAnnos[j];
                            if (paramAnno instanceof JpaParamName) {
                                paramName = ((JpaParamName) paramAnno).value();
                                break;
                            }
                        }
                        if (paramName == null) {
                            throw new RuntimeException("Parameter " + i + " of method " + method + " does not have the annotation " + JpaParamName.class);
                        }
                        namedQuery.setParameter(paramName, args[i]);
                    }
                }
            } else {
                if (args != null && args.length > 0) {
                    for (int i = 0; i < args.length; i++) {
                        namedQuery.setParameter(i + 1, args[i]);
                    }
                }
            }
     
            if (isMultiResults) {
                return namedQuery.getResultList();
            } else {
                return namedQuery.getSingleResult();
            }
        }
    Moi ca m'a beaucoup aide...

Discussions similaires

  1. Peut-on personnaliser ses requêtes avec un CRUD généré ?
    Par beaudelaire dans le forum ASP.NET MVC
    Réponses: 8
    Dernier message: 18/05/2012, 10h06
  2. Faire une requête de contenu sur une liste personnalisée
    Par filigane dans le forum SharePoint
    Réponses: 0
    Dernier message: 13/09/2007, 11h28
  3. [Requête]Personnalisation d'access lors de la création d'une requête
    Par Jealous_Elf dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 29/03/2007, 11h07
  4. Réponses: 4
    Dernier message: 18/02/2007, 22h29
  5. #Erreur dans une requête avec une fonction personnalisée
    Par pguiheu dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 04/07/2006, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo