簡體   English   中英

在jpql查詢中傳遞參數select

[英]Passing a parameter in a jpql query select

我有一個jpql查詢在select子句中實例化一個Java對象

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個參數,所以我可以在構造函數中傳遞它,但出現此錯誤

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

我認為不可能在構造函數中引用參數。 在您的情況下,它拋出NoSuchMethodexeption:這意味着, ChampEtatOT類中沒有具有當前簽名的方法(5個參數而不是8個參數)

您可以參考此答案=> 在jpql查詢中傳遞參數select

因此,嘗試檢索所有數據,然后創建一個過濾器方法以設置ResultList的ChampEtatOT類內的所有etatEntreeSortie

問題已解決,正如您所建議的bRIMOs Bor一樣,無法在SELECT子句中傳遞參數,因此我檢索了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");
                }
            }
        } 
    }

顯然, 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規范,因此您應該對此提出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM