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.