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 :

Exemples JPA des jointures JOIN LEFT


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut Exemples JPA des jointures JOIN LEFT
    Bonjour,
    je cherche des exemples des jointures left join right join avec jpa, car je trouves des problemes pour les faire avec jpa.
    voici mes classes entites :
    Person :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    package com.tuto.jpa.entites;
     
    import java.io.Serializable;
    import javax.persistence.*;
     
     
    /**
     * The persistent class for the person database table.
     * 
     */
    @Entity
    @Table(name="person")
    public class Person implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	@Column(name="EMAIL")
    	private String email;
     
    	@Column(name="FIRSTNAME")
    	private String firstname;
     
    	@Id
    	@Column(name="ID")
    	private int id;
     
    	@Column(name="LASTNAME")
    	private String lastname;
     
    	//bi-directional many-to-one association to Company
        @ManyToOne
    	@JoinColumn(name="COMPANY_ID", referencedColumnName="ID")
    	private Company company;
     
        public Person() {
        }
     
    	public String getEmail() {
    		return this.email;
    	}
     
    	public void setEmail(String email) {
    		this.email = email;
    	}
     
    	public String getFirstname() {
    		return this.firstname;
    	}
     
    	public void setFirstname(String firstname) {
    		this.firstname = firstname;
    	}
     
    	public int getId() {
    		return this.id;
    	}
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
    	public String getLastname() {
    		return this.lastname;
    	}
     
    	public void setLastname(String lastname) {
    		this.lastname = lastname;
    	}
     
    	public Company getCompany() {
    		return this.company;
    	}
     
    	public void setCompany(Company company) {
    		this.company = company;
    	}
     
    }
    Company:
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    package com.tuto.jpa.entites;
     
    import java.io.Serializable;
    import java.util.Set;
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
     
     
    /**
     * The persistent class for the company database table.
     * 
     */
    @Entity
    @Table(name="company")
    public class Company implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@Column(name="ID")
    	private int id;
     
    	@Column(name="NAME")
    	private String name;
     
    	//bi-directional many-to-one association to Person
    	@OneToMany(mappedBy="company")
    	private Set<Person> persons;
     
        public Company() {
        }
     
    	public Company(String name) {
    		super();
    		this.name = name;
    	}
     
    	public String getName() {
    		return this.name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public Set<Person> getPersons() {
    		return this.persons;
    	}
     
    	public void setPersons(Set<Person> persons) {
    		this.persons = persons;
    	}
     
    	public int getId() {
    		return id;
    	}
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
    }
    persistence.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    	<persistence-unit name="tutorial_jpa" transaction-type="RESOURCE_LOCAL">
    		<class>com.tuto.jpa.entites.Person</class>
    		<class>com.tuto.jpa.entites.Company</class>
    		<properties>
    			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpatuto"/>
    			<property name="javax.persistence.jdbc.user" value="root"/>
    			<property name="javax.persistence.jdbc.password" value="root"/>
    		</properties>
    	</persistence-unit>
    </persistence>
    et ma classe test :
    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
    package com.tuto.jpa.test;
     
    import java.util.List;
     
    import javax.persistence.EntityManager;
    import javax.persistence.Query;
     
    import com.tuto.jpa.entites.Person;
    import com.tuto.jpa.util.JpaUtil;
     
    public class TestJpa {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		EntityManager em = JpaUtil.getEntityManager();
    		Query q = em.createQuery("select p From Person p left join Company c with p.id=c.id");
    		List<Person> lsp = q.getResultList();
    		for(Person p : lsp){
    			System.out.println(p.getFirstname() + " " +p.getLastname());
    		}
    	}
     
    }
    la classe JpaUtil :
    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
    package com.tuto.jpa.util;
     
    import javax.persistence.EntityManager;
    import javax.persistence.Persistence;
     
    public class JpaUtil {
     
    	private static EntityManager entityManager;
     
    	private JpaUtil(){
     
    	}
     
    	public static EntityManager getEntityManager(){
    		entityManager = Persistence.createEntityManagerFactory("tutorial_jpa").createEntityManager();
    		return entityManager;
    	}
     
    }
    lorsque j'execute ma classe de test, j'ai l'erreur suivante :
    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
    Exception in thread "main" java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
    Exception Description: Syntax error parsing the query [select p From Person p left join Company c with p.id=c.id].
    Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException
    	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1375)
    	at com.tuto.jpa.test.TestJpa.main(TestJpa.java:18)
    Caused by: Exception [EclipseLink-8023] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.JPQLException
    Exception Description: Syntax error parsing the query [select p From Person p left join Company c with p.id=c.id].
    Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException
    	at org.eclipse.persistence.exceptions.JPQLException.syntaxError(JPQLException.java:352)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:350)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:242)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:359)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.joinAssociationPathExpression(JPQLParser.java:11880)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.join(JPQLParser.java:11488)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.identificationVariableDeclaration(JPQLParser.java:11302)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.fromClause(JPQLParser.java:11164)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:355)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.document(JPQLParser.java:275)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:130)
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:91)
    	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:207)
    	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:182)
    	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:134)
    	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:118)
    	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1373)
    	... 1 more
    Caused by: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException
    	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.joinAssociationPathExpression(JPQLParser.java:11868)
    	... 13 more
    je note que les opérations crud pour une entite marche bien, les erreurs commencent à se produire une fois j'utilise une jointure.

    Merci de votre réponse.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    On ne fait pas la jonction sur la table mais sur la propriété de la classe mère.
    De même, la jonction se fait sans avoir à préciser les colonnes de jointure, le mapping contient ces informations.
    Dans ton cas, ce serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    em.createQuery("select p From Person p left join p.company c");
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut
    Merci OButterlin pour la réponse.
    ça marche maintenant avec cette syntaxe.
    est ce que ça serait la même chose pour right join ?

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    ça me laisse perplexe tout de même, le right join te prend tous les éléments de la table de droite même s'ils n'existe pas dans la gauche...
    Hors, c'est un objet de type "table gauche" qu'on retourne... syntaxe error
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ordre des inner join, left outer join et autres
    Par Dendrite dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/09/2012, 11h47
  2. [MySQL] Multiplier/additionner des COUNT en JOIN LEFT?
    Par kfa1983 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/03/2011, 16h35
  3. probleme de jointure avec left join
    Par carmen256 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/09/2010, 12h57
  4. Innodb Jointure sans LEFT JOIN
    Par mokadjo dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/04/2009, 16h50
  5. Jointures INNER JOIN LEFT JOIN
    Par tizla dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 31/05/2007, 12h12

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