2015-12-23 81 views
1

我有一個JPQL查詢instanciates在SELECT子句中傳遞一個JPQL查詢參數選擇

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(); 
} 

我把3個參數的Java對象,所以我可以通過它在構造函數中 我得到這個錯誤

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") 

我認爲這是不可能把參數在SELECT子句因此,沒有人有一個想法,構造方法如下:

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"; 
       } 
      } 
     } 
    } 
} 

回答

1

我認爲不可能在構造器中引用一個參數。 在您的情況下,它拋出一個NoSuchMethodexeption:這意味着,在你的ChampEtatOT類目前的簽名都沒法(5個參數,而不是8)

你可以參考這個答案=>Passing a parameter in a jpql query select

所以,儘量以檢索那麼所有的數據進行過濾的方法來設置所有etatEntreeSortieChampEtatOT類ResultList

+0

這實際上是錯誤的,正如鏈接問題所述,如果您查看第一條評論。這是JPA提供程序中的一個BUG。 –

1

問題的解決中,如你所說bRIMOs博爾它不可能通過在SELECT子句的參數,所以我有retreived所有結果在List中根據三個日期篩選結果小號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

這實際上是錯誤的,因爲如果你看第一條評論,相關問題就會說明。這是JPA提供程序中的一個BUG。你的「答案」只是這個錯誤的解決方法 –

0

顯然JPQL BNF確實許可證傳遞參數的構造函數的參數。

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 

即一個scalar_expression可以是string_primary,其可以是input_parameter。所以你的JPA提供者不符合JPA規範,你應該提出一個錯誤。