Ik ben sinds een tijdje aan het werken met EB QL met Java EE 6 / JSF 2.0 in Netbeans 6.8. Hiervoor wordt ook JPA 2.0 via EclipseLink gebruikt en dit werkt goed op 1 probleem na.
In SQL kan ik nu het volgende doen:
Deze selecteert de taken van een specifieke gebruiker. Indien g.global_id gelijk is aan null heeft de medewerker de specifieke taak niet. Precies wat volstaat.
Nu de vertaalslag naar EJB's:
Onderstaande query werkt niet geeft een foutmelding:
Onderstaande query werkt wel, maar daar werkt de left outer join als een inner join. Ik krijg dus maar 2 records terug (taak komt zowel voor in Taak als Global voor betreffende medewerker) i.p.v. de 10 via SQL.
Ik krijg het niet voor elkaar om de vertaalslag te maken naar Java voor deze relatie. Ongetwijfeld doe ik iets fout, maar ik zie het niet (meer). Zou iemand mij in de goede richting kunnen duwen?
In SQL kan ik nu het volgende doen:
SQL:
1
| SELECT t.*,g.global_id FROM taak t LEFT OUTER JOIN global g ON g.taak_id=t.taak_id AND gebruiker_id=2 WHERE g.revoked is NULL; |
Deze selecteert de taken van een specifieke gebruiker. Indien g.global_id gelijk is aan null heeft de medewerker de specifieke taak niet. Precies wat volstaat.
Nu de vertaalslag naar EJB's:
Java:
1
2
3
4
5
6
7
8
9
10
11
| @Entity public class Global implements Serializable { *knip* @JoinColumn(name = "gebruiker_id", referencedColumnName = "gebruiker_id") @ManyToOne private Gebruiker gebruikerId; @JoinColumn(name = "taak_id", referencedColumnName = "taak_id") @ManyToOne private Taak taakId; |
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| public class Taak implements Serializable { private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @SequenceGenerator(name = "taak_gen", sequenceName="taak_seq", initialValue=0, allocationSize=1) @GeneratedValue(generator="taak_gen",strategy=GenerationType.SEQUENCE) @Column(name = "taak_id") private Integer taakId; @Column(name = "taaknaam") private String taaknaam; @OneToMany(cascade = CascadeType.ALL, mappedBy = "taakId") private Collection<Global> globalCollection; public Collection<Global> getGlobalCollection() { return globalCollection; } public void setGlobalCollection(Collection<Global> globalCollection) { this.globalCollection = globalCollection; } |
Onderstaande query werkt niet geeft een foutmelding:
code:
1
2
| Exception Description: Syntax error parsing the query [SELECT t.taaknaam FROM Taak t LEFT OUTER JOIN t.globalCollection tgc AND tgc.gebruikerId=:gebruiker WHERE t.cianonly=0], line 1, column 69: syntax error at [AND]. Internal Exception: MismatchedTokenException(6!=-1) |
Onderstaande query werkt wel, maar daar werkt de left outer join als een inner join. Ik krijg dus maar 2 records terug (taak komt zowel voor in Taak als Global voor betreffende medewerker) i.p.v. de 10 via SQL.
code:
1
2
| Query query = em.createQuery("SELECT t,tgc FROM Taak t LEFT OUTER JOIN t.globalCollection tgc WHERE tgc.gebruikerId=:gebruiker AND t.cianonly=0"); query.setParameter("gebruiker", g); |
Ik krijg het niet voor elkaar om de vertaalslag te maken naar Java voor deze relatie. Ongetwijfeld doe ik iets fout, maar ik zie het niet (meer). Zou iemand mij in de goede richting kunnen duwen?
[ Voor 0% gewijzigd door smesjz op 22-01-2010 14:55 . Reden: Code tag fixes voor Java & SQL ]