Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 11h40   #1
Invité de passage
 
Inscription : octobre 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 10
Points : 4
Points : 4
Par défaut [JPQL] Jointure et recherche sur l'id de cette jointure

Salut,

j'ai plusieurs entité dont l’entité genre
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
@Entity
public class Genre implements Serializable
{
 
 
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private String idGenre;
    @Basic(optional = false)
    private String nomGenre;
    @Basic(optional = false)
    private String descriptionGenre;
    @Basic(optional = false)
    private boolean actifGenre;
 
 ...
et une entité article
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
@Entity
public class Article implements Serializable {
 
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private String idArticle;
    @Basic(optional = false)
    private String titre;
    @Basic(optional = false)
 
...
...
    @Basic(optional = false)
    @OneToOne
    private Genre genre;
 
...
...
j'aimerai récupérer tous les articles suivant un genre donné.
donc voici ma requête JPQL:
Code :
1
2
3
4
5
6
7
8
   public List<Article> getArticles(String genre)
    {
        String sql="SELECT DISTINCT a FROM Article a JOIN a.genre g WHERE g.idGenre = :genre";
        Query query=em.createQuery(sql);
        query.setParameter("genre", genre);
 
...
...
et j'ai ce code d'erreur:
Citation:
Caused by: Exception [EclipseLink-6015] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.QueryException
Exception Description: Invalid query key [idGenre] in expression.

Je sent que je passe a coté d'un truc important et que c'est une erreur toute bête, mais je tourne en rond.

Merci d'avance pour vos réponse.
bilgetz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 13h55   #2
Expert Confirmé
 
Homme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 2 253
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 2 253
Points : 2 569
Points : 2 569
Pas besoin d'un join pour un OneToOne
Code :
String sql="SELECT DISTINCT a FROM Article a  WHERE a.genre.idGenre = :genre";
Tu peux tout à fait naviguer à la UML, c'est ca que j'adore chez JPA.
DevServlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h28   #3
Invité de passage
 
Inscription : octobre 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 10
Points : 4
Points : 4
Citation:
Envoyé par DevServlet Voir le message
Pas besoin d'un join pour un OneToOne
Code :
String sql="SELECT DISTINCT a FROM Article a  WHERE a.genre.idGenre = :genre";
Tu peux tout à fait naviguer à la UML, c'est ca que j'adore chez JPA.
Je suis d'accord que çà marche en théorie, mais EclipseLink n'aime pas ça non plus:
Code :
1
2
Caused by: Exception [EclipseLink-6015] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.QueryException
Exception Description: Invalid query key [idGenre] in expression.
En faite il veut pas du Id, et je sais pas pourquoi.
si je fait une requête simple sur l'id il le prend pourtant :
Code :
 String sql="select g from Genre g where g.idGenre=:id";
çà, ça marche parfaitement.

Et si je faite une recherche du type
Code :
1
2
3
Genre genreArt = getGenre(genre);
String sql="SELECT DISTINCT a FROM Article a  WHERE a.genre= :genre";
query.setParameter("genre", genreArt);
C'est SQL Server qui me gueule dessus.
bilgetz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h50   #4
Expert Confirmé
 
Homme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 2 253
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 2 253
Points : 2 569
Points : 2 569
Code :
String sql="select g from Genre g where g.idGenre=:id";
revient à faire un findById.
Code :
1
2
3
4
5
6
7
8
1
2
3
 
 
Genre genreArt = getGenre(genre);
String sql="SELECT DISTINCT a FROM Article a  WHERE a.genre= :genre";
query.setParameter("genre", genreArt);
Normal que ca marche pas, genre est un objet, ca passe pas ca.
DevServlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 17h30   #5
Invité de passage
 
Inscription : octobre 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 5
Points : 1
Points : 1
Par défaut c'est @Basic(optional = false) qui pose problème

Bonjour,

il suffit que tu enlève la première ligne de l'annotation et ça devrait fonctionner.
@Basic(optional = false)
@OneToOne
private Genre genre;
--->

@OneToOne
private Genre genre;

tu dois indiquer le colonnes de jointure aussi.

bon courage.
nf1624 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h15.


 
 
 
 
Partenaires

Hébergement Web