2015-12-23 1 views
1

J'ai une requête JPQL instancie un objet java dans clause selectLe passage d'un paramètre dans une requête JPQL sélectionner

public List<ChampEtatOT> getEtatOT(Date dateDebut, Date dateFin) {  
    Query query = em.createQuery("SELECT NEW ChampEtatOT(ot.numero, uo.denominationFr, ot.etat, ot.dateDebutReelle , ot.dateFinReelle, :dateParam1, :dateParam2, :dateParam3) FROM ordre ot JOIN ot.unite uo") 
      .setParameter("dateParam1", dateDebut, TemporalType.DATE) 
      .setParameter("dateParam2", dateFin, TemporalType.DATE) 
      .setParameter("dateParam3", new Date("2015-01-01"), TemporalType.DATE); 
    return query.getResultList(); 
} 

je mets 3 paramètres, donc je peux le transmettre dans le constructeur je reçois cette erreur

Caused by: Exception [EclipseLink-6137] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryExceptionException Description: An Exception was thrown while executing a ReportQuery with a constructor expression: java.lang.NoSuchMethodException: dz.elit.gmao.commun.reporting.classe.ChampEtatOT.<init>(java.lang.String, java.lang.String, java.lang.String, java.util.Date, java.util.Date)Query: ReportQuery(referenceClass=TravOrdreTravail jpql="SELECT NEW dz.elit.gmao.commun.reporting.classe.ChampEtatOT(ot.numero, uo.denominationFr, ot.etat, ot.dateDebutReelle , ot.dateFinReelle, :dateParam1, :dateParam2, :dateParam3) FROM TravOrdreTravail ot JOIN ot.uniteOrganisationnellle uo") 

Je pense qu'il est impossible de mettre des paramètres dans une clause select ne si quelqu'un a une idée, la méthode constructeur est la suivante:

public ChampEtatOT(String numero, String denominationFr, String etat, Date dateDebutReelle, Date dateFinReelle, Date dateParam1, Date dateParam2, Date dateParam3) { 
    this.numero = numero; 
    this.denominationFr = denominationFr; 

    if (etat.equals("OUV")) { 
     if (dateDebutReelle.before(dateParam1)) { 
      etatEntreeSortie = "En instance debut du mois"; 
     } else { 
      if (dateDebutReelle.before(dateParam2)) { 
       etatEntreeSortie = "En instance fin du mois"; 
      } else { 
       if (dateDebutReelle.after(dateParam1) && dateDebutReelle.before(dateParam2)) { 
        etatEntreeSortie = "Entree/Mois"; 
       } 
      } 
     } 
    } 
} 

Répondre

1

Je pense qu'il n'est pas possible de référencer un paramètre dans le constructeur. dans votre cas, il jette un NoSuchMethodexeption: cela signifie que, pas de méthode avec la signature courante dans votre ChampEtatOT classe (5 paramètres au lieu de 8)

vous pouvez vous référer à cette réponse =>Passing a parameter in a jpql query select

, essayez retrive toutes les données font alors une méthode de filtre pour définir toutes les etatEntreeSortie valeurs à l'intérieur de la classe ChampEtatOT de résultats selon

+0

Ce qui est en fait faux, comme le dit le problème lié si vous regardez le premier commentaire. Ceci est un BUG dans le fournisseur JPA. –

1

problème résolu, comme vous le suggérez bRIMOs Bor il est impossible de passer des paramètres dans une clause SELECT, donc j'ai retreived tous les résultats dans une liste que filtré les résultats en fonction de la date trois s date1, date2, date3

Query query = em.createQuery("SELECT NEW ChampEtatAteliers" 
      + "(ot.numero, uo.denominationFr, ot.etat, ot.dateDebutReelle, ot.dateFinReelle) " 
      + "FROM ordre ot JOIN ot.unite uo"); 
    List<ChampEtatAteliers> champEtatAtelierses = query.getResultList(); 

    for (ChampEtatAteliers champEtatAtelierse : champEtatAtelierses) { 

     if (champEtatAtelierse.getDateDebutReelle().compareTo(date1) >= 0 && champEtatAtelierse.getDateDebutReelle().compareTo(date2) <= 0) { 
      champEtatAtelierList2.add(new ChampEtatAteliers(champEtatAtelierse.getNumero(), champEtatAtelierse.getDenominationFr(), "Entree/Mois")); 
     } 

     if (champEtatAtelierse.getEtat().equals("OUV")) { 
      if (champEtatAtelierse.getDateDebutReelle().compareTo(date1) < 0) { 
       champEtatAtelierse.setEtatEntreeSortie("En instance début du mois"); 
      } else { 
       if (champEtatAtelierse.getDateDebutReelle().compareTo(date2) <= 0) { 
        champEtatAtelierse.setEtatEntreeSortie("En instance fin du mois"); 
       } 
      } 
     } 
    } 
+0

Ce qui est en fait faux, comme le dit le problème lié si vous regardez le premier commentaire. Ceci est un BUG dans le fournisseur JPA. Votre "réponse" est simplement une solution de contournement à ce bug –

0

Il est clair que la JPQL BNF-t paramètres de passage de permis comme arguments du constructeur.

constructor_expression ::= NEW constructor_name (constructor_item {, constructor_item}*) 
constructor_item ::= single_valued_path_expression | scalar_expression | aggregate_expression | 
    identification_variable 
scalar_expression ::= simple_arithmetic_expression | string_primary | enum_primary | 
    datetime_primary | boolean_primary | case_expression | entity_type_expression 
string_primary ::= state_field_path_expression | string_literal | 
    input_parameter | functions_returning_strings | aggregate_expression | case_expression 

i.e. un scalar_expression peut être un string_primary, qui peut être un input_parameter. Votre fournisseur JPA ne répond donc pas aux spécifications JPA et vous devriez lui signaler un bug.