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

Hibernate Java Discussion :

Erreur "org.hibernate.criterion.PropertyProjection cannot be cast to org.hibernate.criterion.Criterion"


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut Erreur "org.hibernate.criterion.PropertyProjection cannot be cast to org.hibernate.criterion.Criterion"
    Bonjour,

    Désolée de vous embêter avec çà, mais je suis confronté à un problème et je n'arrive pas à le résoudre, comment vous vous en doutez.

    J’essaie de récupérer une liste d'informations, informations devant être groupées par idPersonne afin d'éviter les doublons.

    Ma requête SQL est de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM perssemainecompt
    WHERE idSemaine =538
    GROUP BY idPersonne
    Donc j'ai développé cette méthode pour pouvoir avoir les informations :

    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
    public List<PersSemaineComptDTO> getListPersSemaineComptByIdSemaine(SemaineDTO semaineDto){
    		List<PersSemaineComptDTO> persSemaineComptDTOs = new ArrayList<PersSemaineComptDTO>();
    		DetachedCriteria criteria = DetachedCriteria.forClass(Perssemainecompt.class);
    		criteria.add(Restrictions.eq("semaine", semaineDto.getSemaineBeanFromDTO()));
     
    		criteria.add( (Criterion) Projections.groupProperty("idPersonne") );
     
    		Semaine semaineBean = semaineDto.getSemaineBeanFromDTO();
     
    		List<Perssemainecompt> persSemaineCompts = this.persSemaineComptDao.getPersSemainecomptBeanByCriteria(criteria);
    		for (Perssemainecompt persSemaineComptBean : persSemaineCompts){
    			PersSemaineComptDTO PersSemaineComptDto = new PersSemaineComptDTO(persSemaineComptBean);
    			System.out.println("je suis dans getListPersSemaineComptByIdSemaine ");
    			//On récupére le compteur relatif à cette table
    			CompteurDTO compteurDto = this.compteurService.getCompteurById(persSemaineComptBean.getCompteur().getIdCompteur());
     
    			PersSemaineComptDto.setCompteurDto(compteurDto);
     
    			PersonneDTO personneDto = this.personneService.getPersonnebyId(persSemaineComptBean.getPersonne().getIdPersonne());
    			PersSemaineComptDto.setPersonneDto(personneDto);
     
    			persSemaineComptDTOs.add(PersSemaineComptDto);
    		}
    		return persSemaineComptDTOs;
    	}
    Or j'ai ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ClassCastException: org.hibernate.criterion.PropertyProjection cannot be cast to org.hibernate.criterion.Criterion
    J'ai importé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import org.hibernate.criterion.Criterion;
    import org.hibernate.criterion.DetachedCriteria;
    import org.hibernate.criterion.Order;
    import org.hibernate.criterion.Projections;
    import org.hibernate.criterion.Restrictions;
    import org.hibernate.hql.classic.GroupByParser;
    Pourriez vous me dire où se trouve le problème s'il vous plait, et comment le résoudre.
    Je vous en remercie d'avance

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Je n'y connais pas grand chose en Hibernate mais je peux néanmoins te dire que ton erreur n'a rien à voir avec une histoire d'import. Là il te dit qu'il ne faut pas mélanger les choux et les carottes.

    Je suppose donc que c'est cette ligne qui est incriminée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    criteria.add( (Criterion) Projections.groupProperty("idPersonne") );
    La méthode add() attend un Criterion en paramètre mais ce n'est pas ce que tu lui mets (car tu lui mets un PropertyProjection). Il te dit donc clairement :
    org.hibernate.criterion.PropertyProjection cannot be cast to org.hibernate.criterion.Criterion
    Il semblerait que Criterion ait une méthode setProjection() justement.

  3. #3
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut
    Merci beaucoup pour votre réponse. Le problème venait effectivement de là .

    Par contre, j'ai désormais un autre message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.maison.enfant.gestion.horaire.entitybeans.Personne_$$_javassist_5 cannot be cast to com.maison.enfant.gestion.horaire.entitybeans.Perssemainecompt
    Sachant que dans ma classe Perssemainecompt.java, j'ai :
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    package com.maison.enfant.gestion.horaire.entitybeans;
     
    // default package
    // Generated 8 juil. 2012 18:26:09 by Hibernate Tools 3.4.0.CR1
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import static javax.persistence.GenerationType.IDENTITY;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
     
    /**
     * Perssemainecompt generated by hbm2java
     */
    @Entity
    @Table(name = "perssemainecompt", catalog = "gestionhoraire")
    public class Perssemainecompt implements java.io.Serializable {
     
    	private Integer idPersSemaineCompt;
    	private Compteur compteur;
    	private Semaine semaine;
    	private Personne personne;
    	private Jour jour;
     
    	public Perssemainecompt() {
    	}
     
    	public Perssemainecompt(Compteur compteur, Semaine semaine,
    			Personne personne, Jour jour) {
    		this.compteur = compteur;
    		this.semaine = semaine;
    		this.personne = personne;
    		this.jour = jour;
    	}
     
    	@Id
    	@GeneratedValue(strategy = IDENTITY)
    	@Column(name = "idPersSemaineCompt", unique = true, nullable = false)
    	public Integer getIdPersSemaineCompt() {
    		return this.idPersSemaineCompt;
    	}
     
    	public void setIdPersSemaineCompt(Integer idPersSemaineCompt) {
    		this.idPersSemaineCompt = idPersSemaineCompt;
    	}
     
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "idCompteur", nullable = false)
    	public Compteur getCompteur() {
    		return this.compteur;
    	}
     
    	public void setCompteur(Compteur compteur) {
    		this.compteur = compteur;
    	}
     
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "idSemaine", nullable = false)
    	public Semaine getSemaine() {
    		return this.semaine;
    	}
     
    	public void setSemaine(Semaine semaine) {
    		this.semaine = semaine;
    	}
     
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "idPersonne", nullable = false)
    	public Personne getPersonne() {
    		return this.personne;
    	}
     
    	public void setPersonne(Personne personne) {
    		this.personne = personne;
    	}
     
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "idJour", nullable = false)
    	public Jour getJour() {
    		return this.jour;
    	}
     
    	public void setJour(Jour jour) {
    		this.jour = jour;
    	}
     
    }
    et dans ma fonction, j'ai désormais :

    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
     
    public List<PersSemaineComptDTO> getListPersSemaineComptByIdSemaine(SemaineDTO semaineDto){
    		List<PersSemaineComptDTO> persSemaineComptDTOs = new ArrayList<PersSemaineComptDTO>();
    		DetachedCriteria criteria = DetachedCriteria.forClass(Perssemainecompt.class);
    		criteria.add(Restrictions.eq("semaine", semaineDto.getSemaineBeanFromDTO()));
    		criteria.setProjection(Projections.groupProperty("personne"));
    		System.out.println("Je suis dans criteria");
     
     
    		Semaine semaineBean = semaineDto.getSemaineBeanFromDTO();
     
    		List<Perssemainecompt> persSemaineCompts = this.persSemaineComptDao.getPersSemainecomptBeanByCriteria(criteria);
    		for (Perssemainecompt persSemaineComptBean : persSemaineCompts){
    			PersSemaineComptDTO PersSemaineComptDto = new PersSemaineComptDTO(persSemaineComptBean);
    			System.out.println("je suis dans getListPersSemaineComptByIdSemaine ");
    			//On récupére le compteur relatif à cette table
    			CompteurDTO compteurDto = this.compteurService.getCompteurById(persSemaineComptBean.getCompteur().getIdCompteur());
     
    			PersSemaineComptDto.setCompteurDto(compteurDto);
     
    			PersonneDTO personneDto = this.personneService.getPersonnebyId(persSemaineComptBean.getPersonne().getIdPersonne());
    			PersSemaineComptDto.setPersonneDto(personneDto);
     
    			persSemaineComptDTOs.add(PersSemaineComptDto);
    		}
    		return persSemaineComptDTOs;
    	}

    Je vous remercie d'avance de votre aide

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Hibernate t'as retourné, probablemet à cause de ta projection, une liste de Personne et tu essaie d'en faire une liste de Perssemainecompt

  5. #5
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut
    Merci beaucoup pour votre aide

    Avant ma requête était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM perssemainecompt
    WHERE idSemaine =538
    Et j'obtenais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    idPersSemaineCompt 	idSemaine 	idCompteur 	idPersonne   	idJour
    1265                   	538 	           741         	48 	         2281
    1266                  	538 	           741          	48	         2282 
    1267                  	538 	           741         	48 	         2283
    1268                  	538 	           741         	48 	         2284
    1269                  	538 	           741          	48 	         2285
    1270                  	538 	           741          	48 	         2286
    1271                  	538  	           741          	48 	         2287
    1272                  	538 	           742          	49 	         2288
    1273                  	538  	           742          	49 	         2289
    1274                  	538 	           742          	49 	         2290
    Etc ...
    Cette table me permet de savoir les horaires (attribut "jour") d'une personne sur une semaine donnée. On outre, elle me permet de savoir et le nombre d'heure qu'elle doit faire et qu'elle à fait (attribut "compteur").
    Comme il y a plusieurs jours dans une semaine, j'ai donc des répétitions. Dans un cas précis, elle sont inutile.....

    C'est pourquoi, j’essaie de les regrouper par "idPersonne".


    Avec cette requête SQL,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM perssemainecompt
    WHERE idSemaine =538
    GROUP BY idPersonne
    j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    idPersSemaineCompt 	idSemaine 	idCompteur 	idPersonne   	idJour
    1265 	                         538           	741    	48 	        2281
    1272 	 	                 538           	742    	49 	       	2288
    1279 	 	                 538           	743    	50 	        2295
    1291 	 	                 538           	744    	51 	        2307
    1298 	 	                 538           	745    	52 	        2314
    1305 	 	                 538           	746    	53 	        2321
    Ainsi,comment pourrais je "caster" cette liste de Personne en une liste de Perssemainecompt

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par leara500 Voir le message
    Avec cette requête SQL,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM perssemainecompt
    WHERE idSemaine =538
    GROUP BY idPersonne
    j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    idPersSemaineCompt 	idSemaine 	idCompteur 	idPersonne   	idJour
    1265 	                         538           	741    	48 	        2281
    1272 	 	                 538           	742    	49 	       	2288
    1279 	 	                 538           	743    	50 	        2295
    1291 	 	                 538           	744    	51 	        2307
    1298 	 	                 538           	745    	52 	        2314
    1305 	 	                 538           	746    	53 	        2321
    Ainsi,comment pourrais je "caster" cette liste de Personne en une liste de Perssemainecompt
    Bizzare, tous les SGBD que je connais vont t'envoyer pêter avec cette requete car, hormis la colonne idSemaine (dont on sait qu'elle est 538) et la colonne idPersonne (dont on sais par le group by qu'elle est commune à tout le monde), rien d'autre ne peux être extrait de la table.

    Avec un group by, du coté des colonnes du select, on ne peux mettre que des membres aparaissant dans la clause group by ou des fonctions d'aggrégation (max, min, etc) rien d'autre.

    En l'occurence, dans ton code, tu met un group by Personnes, hibernate fait naturelement ce qui est nécessaire, à savoir retourner des Personnes. Pour être plus précis, le criteria que tu as rédigé retourne toutes les Personnes ayant une entrée dans la semaine comptable que tu as passée depuis ton DTO.

    Pour le reste, je ne vois pas ce que tu cherche à faire exactement d'autre.

  7. #7
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut
    Dans un cas précis, je n'ai pas besoin des jours et du compteur. Il me juste les personne dans une semaine données.

    J'ai un problème dans le temps de chargement de ma page qui est trop longue à cause de la présence de l'attribut jour et compteur (j'utilise une boucle for)

    Il ne me faut que les personnes qui travaille dans une semaine donnée.

    Auriez vous une idée de comment faire ?

    Merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/05/2013, 18h32
  2. Réponses: 2
    Dernier message: 17/02/2012, 14h11
  3. Réponses: 1
    Dernier message: 18/10/2011, 23h55
  4. Réponses: 2
    Dernier message: 21/07/2008, 14h53
  5. Message d`erreur " error:cannot read : src/main/org/pache/tools/bzip2/*.java "
    Par wiss20000 dans le forum RedHat / CentOS / Fedora
    Réponses: 0
    Dernier message: 09/11/2007, 15h36

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