Partage
  • Partager sur Facebook
  • Partager sur Twitter

Hibernate - Erreur de Query

    17 novembre 2017 à 11:21:13

    Bonjour a tous, voici mon soucis :

    Je fais 3 query afin de bien etre sur de ce que je fais soit :

    List query = main.em.createQuery(
                                "SELECT id FROM Competitor c WHERE c.name LIKE :cName")
                                .setParameter("cName", nomsVainqueurs.get(i))
                                .getResultList();
    
                        List queryStage = main.em.createQuery(
                                "SELECT id FROM Stage s WHERE s.id = :sId")
                                .setParameter("sId", numEtape)
                                .getResultList();
    List queryPerfs = main.em.createQuery( "SELECT p.id FROM Performance p WHERE p.stage = :p_ids AND p.id_competitor = :p_idc") .setParameter("p_ids", queryStage.get(0)) .setParameter("p_idc", query.get(0)) .getResultList();

    Comme vous le voyez je decompose bien le probleme, pire encore, le System.out.println() fonctionne bien si je le fais avant queryPerfs:

    System.out.println(query.get(0) + " => " + queryStage.get(0));

    Cependant lors de l'execution voici mon erreur :

    Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private long fr.ua.iutlens.data.model.Stage.id] by reflection for persistent property [fr.ua.iutlens.data.model.Stage#id] : 1
    	at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147)
    	at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
    	at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1347)
    	at org.hibernate.Query.getResultList(Query.java:416)
    	at fr.ua.iutlens.data.main.completionDesPerformances(main.java:223)
    	at fr.ua.iutlens.data.main.main(main.java:489)
    Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private long fr.ua.iutlens.data.model.Stage.id] by reflection for persistent property [fr.ua.iutlens.data.model.Stage#id] : 1
    	at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:71)
    	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:223)
    	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4646)
    	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4357)
    	at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:226)
    	at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:276)
    	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:455)
    	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:161)
    	at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53)
    	at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628)
    	at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1949)
    	at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1902)
    	at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1880)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:925)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
    	at org.hibernate.loader.Loader.doList(Loader.java:2608)
    	at org.hibernate.loader.Loader.doList(Loader.java:2591)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)
    	at org.hibernate.loader.Loader.list(Loader.java:2418)
    	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
    	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
    	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
    	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1449)
    	at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1366)
    	at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1338)
    	... 3 more
    Caused by: java.lang.IllegalArgumentException: Can not set long field fr.ua.iutlens.data.model.Stage.id to java.lang.Long
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    	at sun.reflect.UnsafeLongFieldAccessorImpl.getLong(UnsafeLongFieldAccessorImpl.java:60)
    	at java.lang.reflect.Field.getLong(Field.java:611)
    	at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:61)
    	... 27 more


    J'ai rechercher sur internet cependant on parle d'un bug en version 5.0 or voici mes dependances :

    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    
        compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.6'
        compile 'org.jsoup:jsoup:1.8.3'
        compile 'org.hibernate:hibernate-core:5.2.0.Final'
        compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final'
    
        compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.2'
        compile group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.4.5'
        compile 'commons-logging:commons-logging:1.2'
    
        compile group: 'org.json', name: 'json', version: '20090211'
        compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.7'
        compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.7'
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }

    Quelqu'un saurait-il me renseigner ? Quentin


    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2017 à 11:55:16

      Bonjour.

      Pourrais-tu montrer ton @Entity ? merci

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        17 novembre 2017 à 11:56:56

        Peu tu montrer ta classe Stage ?

        EDIT: grilled ><

        -
        Edité par florent m 17 novembre 2017 à 11:57:14

        • Partager sur Facebook
        • Partager sur Twitter
          17 novembre 2017 à 13:57:12

          Bonjour voici mon @Entity (ne pas faire attention au query dans le constructeur, c'est temporaire) :

          package fr.ua.iutlens.data.model;
          
          import fr.ua.iutlens.data.main;
          import fr.ua.iutlens.data.manager.StageManager;
          
          import javax.persistence.Entity;
          import javax.persistence.*;
          import java.util.ArrayList;
          import java.util.Date;
          import java.util.List;
          
          @Entity
          @Table(name= "stage")
          public class Stage {
              @Id
              @GeneratedValue(strategy=GenerationType.IDENTITY)
              private long id;
              @OneToMany(mappedBy = "stage", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
              private List<Performance> performances;
          //    private Date dateStage;
          
              @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH })
              @JoinColumn(name="id_start")
              private City id_start;
          
              @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH })
              @JoinColumn(name="id_end")
              private City id_end;
          
              private long duration; // duration est en km !
          
              public Stage(){
          
              }
          
              public Stage(StageManager stage) {
          
                  this.performances = new ArrayList<>();
                  if (stage == null){
                      return;
                  }
          
                  this.duration = stage.getDuration();
          
                  List query_start =  main.em.createQuery(
                          "SELECT id FROM City c WHERE c.name = :cName")
                          .setParameter("cName", stage.getId_start())
                          .getResultList();
          
                  List query_end =  main.em.createQuery(
                          "SELECT id FROM City c WHERE c.name = :cName")
                          .setParameter("cName", stage.getId_end())
                          .getResultList();
          
                  this.id_start = main.em.find(City.class, query_start.get(0));
                  this.id_end = main.em.find(City.class, query_end.get(0));
              }
          
              public long getId() {
                  return id;
              }
          
              public void setId(long id) {
                  this.id = id;
              }
          
          /*    public Date getDateStage() {
                  return dateStage;
              }
          
              public void setDateStage(Date dateStage) {
                  this.dateStage = dateStage;
              }*/
          
              public List<Performance> getPerformances() {
                  return performances;
              }
          
              public void setPerformances(List<Performance> performances) {
                  this.performances = performances;
              }
          
              public City getId_start() {
                  return id_start;
              }
          
              public void setId_start(City id_start) {
                  this.id_start = id_start;
              }
          
              public City getId_end() {
                  return id_end;
              }
          
              public void setId_end(City id_end) {
                  this.id_end = id_end;
              }
          
              public long getDuration() {
                  return duration;
              }
          
              public void setDuration(long duration) {
                  this.duration = duration;
              }
          }
          


          PS :

          Voici comment j'ai changer et bizarrement cela fonctionne :

                                  List query = main.em.createQuery(
                                          "SELECT id FROM Competitor c WHERE c.name LIKE :cName")
                                          .setParameter("cName", nomsVainqueurs.get(i))
                                          .getResultList();
          
                                  List queryStage = main.em.createQuery(
                                          "SELECT id FROM Stage s WHERE s.id = :sId")
                                          .setParameter("sId", numEtape)
                                          .getResultList();
          
                        
                                  long idStage = (long) queryStage.get(0);
                                  long idCompetitor = (long) query.get(0);
          
                                  List queryPerfs = main.em.createQuery(
                                          "SELECT p.id FROM Performance p WHERE p.stage = " + idStage + " AND p.id_competitor = " + idCompetitor)
                                          .getResultList();
          
                                  if (queryPerfs.size() > 0) {
                                      Performance p = em.find(Performance.class, queryPerfs.get(0));
                                      em.getTransaction().begin();
                                      p.setJaune(p.isJaune() || urlsVainqueurs.get(i).split("TDF_")[1].equals("JAUNE.png"));
                                      p.setGrimpeur(p.isGrimpeur() || urlsVainqueurs.get(i).split("TDF_")[1].equals("POIS.png"));
                                      em.persist(p);
                                      em.getTransaction().commit();
                                  }



          -
          Edité par MrQu3ntin 17 novembre 2017 à 14:00:23

          • Partager sur Facebook
          • Partager sur Twitter
            17 novembre 2017 à 14:12:14

            Essaye de passer les types primitifs que tu utilise par leurs encapsulations objet (typiquement tes long en Long)
            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2017 à 15:03:13

              florent m a écrit:

              Essaye de passer les types primitifs que tu utilise par leurs encapsulations objet (typiquement tes long en Long)

              Ce que j'allais dire :soleil:

              De manière générale je conseillerais d'utiliser des types Object (Wrapper des types primitifs) donc nullable (ou Optional) dans les POJO (@Entity, DTO, ...).
              L'objectif est que cela plante (par NullPointerException par exemple) lorsque l'on oublie d'initialiser une propriété, plutôt que de se retrouver avec des champs initialisés avec une valeur par défaut (0 en l'occurrence).

              • Partager sur Facebook
              • Partager sur Twitter
              Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)

              Hibernate - Erreur de Query

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown