简体   繁体   English

在jpql查询中传递参数select

[英]Passing a parameter in a jpql query select

I have a jpql query instanciates a java object in select clause 我有一个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();
}

I put 3 parameters, so i can pass it in the constructor I get this error 我放了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")

I think that it's not possible to put parameters in a select clause so does anyone have an idea, the constructor method is as follows: 我认为不可能将参数放在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";
                }
            }
        }
    } 
}

I think that it's not possible to reference a parameter in the contructor. 我认为不可能在构造函数中引用参数。 in your case it throws a NoSuchMethodexeption : it means that, no method with the current signature in your ChampEtatOT class (5 parameters instead of 8 ) 在您的情况下,它抛出NoSuchMethodexeption:这意味着, ChampEtatOT类中没有具有当前签名的方法(5个参数而不是8个参数)

you can refer to this answer => Passing a parameter in a jpql query select 您可以参考此答案=> 在jpql查询中传递参数select

So ,try to retrive all data then make a filter method to set all the etatEntreeSortie values inside the ChampEtatOT class of the ResultList 因此,尝试检索所有数据,然后创建一个过滤器方法以设置ResultList的ChampEtatOT类内的所有etatEntreeSortie

Problem solved, as you suggested bRIMOs Bor it's not possible to pass parameters in a SELECT clause, so i have retreived all the results in a List than filtered the results according to the three dates date1, date2, date3 问题已解决,正如您所建议的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");
                }
            }
        } 
    }

Clearly the JPQL BNF does permit passing parameters as constructor arguments. 显然, 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

ie a scalar_expression can be a string_primary , which can be an input_parameter . scalar_expression可以是string_primary ,也可以是input_parameter So your JPA provider is not meeting the JPA spec and you should raise a bug on it. 因此,您的JPA提供程序不符合JPA规范,因此您应该对此提出错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM