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 :
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
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; } }
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
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; } }
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 <?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>
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
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()); } } }
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 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; } }
je note que les opérations crud pour une entite marche bien, les erreurs commencent à se produire une fois j'utilise une jointure.
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
Merci de votre réponse.
Partager