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

Hibernate Java Discussion :

Criteria ajout d'objets avec une jointure


Sujet :

Hibernate Java

  1. #1
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut Criteria ajout d'objets avec une jointure
    bonjour,

    je voudrais faire une pseudo jointure avec les criteria, pseudo parceque je veux lier une colonne de la table à une autre colonne d'une table ou une vue..

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class User
    long userId;
    String login;
    String nom;
     
     
    class UserInfo
    long id,
    String login;
    String nom;
    je souhaiterais lors de la recherche recuperer les objets UserInfo pour un login.

    avec User = (1,"monLogin",null)
    UserInfo = (1,"monLogin","Pierre")
    UserInfo = (2,"monLogin","Paul)

    la recherche pour User 1 doit donner (1,"monLogin","Pierre") + (2,"monLogin","Paul")

    merciii

  2. #2
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Je n'ai pas tres bien saisis laquelle de tes clés faisait le lien entre les 2 tables. Quelle est ta foreignKey au juste?

    Pour tout récupérer le plus simple est peut etre de disposer d'un objet UserInfo dans ta classe User :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class User
    long userId;
    String login;
    UserInfo ui;
     
    class UserInfo
    long id,
    String login;
    String nom;
    Dans ta base de données des tables de ce type (la foreignKey est du style user.numUi = userInfo.id) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    table User
    long userId
    String login
    Integer numUi
     
    table UserInfo
    long id
    String login
    String nom
    Ton mapping Hibernate de User avec un many-to-one:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <many-to-one name="ui" column="numUi" not-null="true" />
    Un criteria pour ta requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Criteria crit = taSession.createCriteria(User.class);
    Transaction tx = taSession.beginTransaction() ;
    List users = crit.list() ;
    tx.commit();
    Si tu veux mettre des restrictions sur le login de User par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    crit.add(Restrictions.eq("login", "monLoginExemple")) ;
    Si tu veux mettre des restrictions sur le nom de UserInfo par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    crit.createCriteria("ui").add(Restrictions.eq("nom", "monUserInfoNom"));
    En espérant avoir pu t'aider.
    Autrement, tu as des tas d'exemple de pages de loggin sur le net.

    Bonne journée.

  3. #3
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par Alyx² Voir le message
    Bonjour,

    Je n'ai pas tres bien saisis laquelle de tes clés faisait le lien entre les 2 tables. Quelle est ta foreignKey au juste?
    au fait, il n'y pas de foreugn key, c'est pour ça que je parle de pseudo jointure. peut etre que la solution est de faire un subCriteria, ou d'utiliser les ResultTrandform mais je ne vois pas encore comment le faire,
    pour faire simple..

    ma vue userInfo contient tous les users et leurs login.
    la table User contient que le login, la colonne nom est toujous null (la table est remplie a partir d'un fichier text elle ne contient pas toute les infos)..
    qd je fais ma recherche sur la table de base User, j'ai que le login et je veux dans dupliquer la ligne pour tous les noms avec le meme login..

    je ne sais pas si c'est clair

  4. #4
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    ma vue userInfo contient tous les users et leurs login.
    Si tu as déjà toutes les infos dont tu as besoin dans ta vue UserInfo, pourquoi aller faire une jointure sur la table User?

    Récupère simplement userInfo ?

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par Alyx² Voir le message
    Récupère simplement userInfo ?
    désolè, je nai pas bien expliqué,
    la classe User elle contient d'autre informations communes à tous les userInfo, au fait les informations concernent un login,mais comme l'utilisateur a besoin de voir le nom et le penom et qu'un login peut correspondre à plusieurs noms, je dois dupliquer la ligne pour un login pour chaque nom..

  6. #6
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Oki donc tu as bien une relation 1 à plusieurs.

    Mais alors c'est un problème de conception. Pour ma part, une bdd avec des relations 1-~ a forcément des foreign key (même implicitement déclarées).
    Sinon, tu ne pourras jamais relier tes données.

    Peut etre que ton mapping hibernate nous aiderait à mieux comprendre ce que tu cherches à faire

    Dsl de ne pas pouvoir t'aider.

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par Alyx² Voir le message
    Oki donc tu as bien une relation 1 à plusieurs.

    Mais alors c'est un problème de conception. Pour ma part, une bdd avec des relations 1-~ a forcément des foreign key (même implicitement déclarées).
    Sinon, tu ne pourras jamais relier tes données.

    Peut etre que ton mapping hibernate nous aiderait à mieux comprendre ce que tu cherches à faire

    Dsl de ne pas pouvoir t'aider.
    ouii en effet, c'est un probleme de conception, mais j'y suis pour rien ..
    sous sql j'aurais pu faire la jointure sans avoir une clé etrangère..avec hibernate apparement ce n'est pas possible..
    je ne sais pas si je peux faire la jointure car la colonne en question n'est pas clé primaire de l'autre table..

  8. #8
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    je ne sais pas si je peux faire la jointure car la colonne en question n'est pas clé primaire de l'autre table..
    Dans l'absolu, tu peux faire une jointure sur n'importe quelle colonne (clé primaire ou non). Apres, c'est juste un pb d'indexation et donc de performance.

    Si l'info en commun entre tes 2 tables c'est le login de la personne, tu n'auras pas d'autre choix que de faire la jointure sur ce champ (en espérant qu'il soit unique ).

    Ca te donnera user.login = userInfo.login (ou sur le nom de la personne).

    Mais par contre, oui je crois bien que cette relation doit être représentée dans tes classes (ou au moins ton mapping hibernate).

    Bon courrage

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    ok,

    je vais essayer de faire la jointure..elle est unique la colonne ..
    au fait je pensais que je pouvais faire la jointure avec hibernate que si la clé est clé etrangere..
    mercii

  10. #10
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    re...salut
    au fait, je ne peux pas faire la jointure, j'explique par un exemple de requete sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    User:
    id
    userInfo
    loginId
    firstName
    lastName
     
    Logins
    id
    loginId
    firstName
    lastName
    en sql je peux faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select u.id,u.userInfo, u.loginId, l.firstName,l.lastName  FROM User u LEFT JOIN Logins l on u.loginId = l.loginId

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    quelqu'un connais bien l'api criteria??

    peut on faire ce genre de requete.avec les result transform par exemple?

    merci!

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    re...salut
    au fait, je ne peux pas faire la jointure, j'explique par un exemple de requete sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    User:
    id
    userInfo
    loginId
    firstName
    lastName
     
    Logins
    id
    loginId
    firstName
    lastName
    en sql je peux faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select u.id,u.userInfo, u.loginId, l.firstName,l.lastName  FROM User u LEFT JOIN Logins l on u.loginId = l.loginId
    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
     
    // attention User = nom de la classe pas de la table...
    Criteria userCriteria = getSession().createCriteria("User") ;
     
    // de nouveau en supposant Logins nom de classe et non pas de la table...
    Critera loginsCriteria = userCriteria.createCriteria("Logins") ;
     
    /* 
    à partir d'ici vous pouvez ajouter des critères WHERE sur chacun des criteria userCriteria ou loginsCriteria vi add(Criterion) et ajouter des ORDER BY (addOrder)
    en gardant à l'esprit que ce que vous ajoutez à user doit concernez des attributs de User et idem pour Logins...
     
    le résultat s'obtient par
     
    userCriteria.list() ;
     
    (et ce sera une List<User> pas une List<Object[]>)
     
    et la jointure ne fonctionnera évidemment que si elle est déclarée dans les fichiers de mapping ou via les annotations JPA
    sinon Hibernate ne peut pas deviner tout sur quel champ le join doit se faire...
     
    */

Discussions similaires

  1. [MySQL] probléme de repetition avec une jointure
    Par kenzo83220 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/11/2006, 17h24
  2. Réponses: 1
    Dernier message: 23/08/2006, 14h11
  3. ajout de données avec une relation N-à-N
    Par yeah_baby64 dans le forum Access
    Réponses: 3
    Dernier message: 28/07/2006, 18h19
  4. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42
  5. nommer un objet avec une variable
    Par fatcat dans le forum C++
    Réponses: 4
    Dernier message: 11/12/2005, 16h16

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